0

У меня есть зависимость ServiceLifetime.Scoped, которую я хочу создать только один раз для каждого веб-запроса, но ему нужно выполнить запрос на две службы. Один из них - это интерфейс, выполняемый реализацией, другой - сама реализация. Сейчас я в основном это делаю:Использовать ту же реализацию для двух служб с ASP.NET Dependency Injection

public interface IService {} 

public class ServiceImplementation : IService { 
    public Object ImplementationSpecificState; 
} 

public void ConfigureServices(IServiceCollection services) { 
    services.AddScoped<IService, ServiceImplementation>(); 
    services.AddScoped<ServiceImplementation>(); 
} 

К сожалению, это дает мне два разных объекта с каждым веб-запросом. Один в коде, который зависит от ServiceImplementation, и другой в коде, который зависит от IService.

Как сделать запросы для IService и ServiceImplementation предоставить один и тот же базовый объект?

ответ

3

С помощью implementationFactory-based extension method вы можете вернуться в граф зависимости IServiceProvider, чтобы получить реализацию при запросе интерфейса, и вы даже не потеряете проверку типа компиляции.

public void ConfigureServices(IServiceCollection services) { 
    services.AddScoped<ServiceImplementation>(); 
    services.AddScoped<IService>(
     provider => provider.GetService<ServiceImplementation>() 
    ); 
} 

Необычные.

+0

Подождите! Вы ответили на свой вопрос?!? – Brad

+0

Да, это в рамках рекомендаций. Я застрял около 20 минут и опубликовал его, затем подумал об этом немного и решил его через 10 минут. Наверное, мне нужна была небольшая отладка резиновой утки. – Technetium

 Смежные вопросы

  • Нет связанных вопросов^_^