Как в 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))
  • Вопрос задан
  • 43 просмотра
Пригласить эксперта
Ответы на вопрос 2
NYMEZIDE
@NYMEZIDE
программист
изучите паттерн Фабричный метод
в конструктор вам необходимо инжектить Фабрику.

А уже в методах контроллера вы будете обращаться к Фабрике -> дай мне конкретную реализацию (создай мне ее)
И дальше работаешь с ней как обычно.
Ответ написан
@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>();
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Fastdev AB Ижевск
До 140 000 руб.
Hunt4You Севастополь
от 60 000 до 120 000 руб.
22 марта 2019, в 06:30
10000 руб./за проект
22 марта 2019, в 03:12
20000 руб./за проект
22 марта 2019, в 01:06
4000 руб./за проект