Как в ASP.NET Core инжектировать конкретную реализацию?

Добрый день!

Столкнулся с проблемой на которую пока не нашел решения.

Есть интерфейс: interface IService { long GetAvailableMemory(); }
Есть классы реализующие этот интерфейс: HDDService, RAMService, ....
Используя стоковый DI от Microsoft, я регистрирую сервисы:
services.AddScope<IService, HDDService>();
services.AddScope<IService, RAMService>();
services.AddScope<IService, ....>();


И в каком-нибудь контроллере инжектирую по интерфейсу
public class AdminController
{
    private readonly IService _service;
    ctor(IService service)
    {
        _service = service; // <------ ???????????
    }
}


Как добиться управляемого инжектирования (я хочу чтобы в текущем примере инжектировался именно RAMService), не указывая в конструкторе конкретную реализацию (не так! -> ctor(RAMService service))
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 2
NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru
изучите паттерн Фабричный метод
в конструктор вам необходимо инжектить Фабрику.

А уже в методах контроллера вы будете обращаться к Фабрике -> дай мне конкретную реализацию (создай мне ее)
И дальше работаешь с ней как обычно.
Ответ написан
Комментировать
@netcore
Тенанты назваются такие вещи. В основном используется арендаторами, когда у тебя один код, и в зависимости от запроса\ползьователя\заголовков подкладываешь разные БД. Можно и тут заюзать.

public interface ITenantServiceProvider
    {
        IService Service { get; }
    }

    public class TenantServiceProvider : ITenantServiceProvider
    {
        public IService Service { get; private set; }

        public TenantServiceProvider(HttpContextAccessor contextAccessor)
        {
            var controllerName = contextAccessor.HttpContext.GetRouteData().Values["controller"].ToString().ToLower();
            if (controllerName.Contains("admin"))
                Service = contextAccessor.HttpContext.RequestServices.GetService(typeof(HDDService));
        }
    }


Использовать так:
services.AddScoped<HDDService>();
services.AddScoped<ITenantServiceProvider,TenantServiceProvider>();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы