У меня есть службы, полученные из одного интерфейса
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Обычно другие контейнеры IOC, такие как Unity
позволяют вам регистрировать конкретные реализации некоторым Key
который их отличает.
В Asp.Net Core как зарегистрировать эти службы и решить их во время выполнения на основе какого-то ключа?
Я не вижу, чтобы какой-либо из методов Add
Service принимал параметр key
или name
который обычно используется для различения конкретной реализации.
public void ConfigureServices(IServiceCollection services)
{
// How do I register services here of the same interface
}
public MyController:Controller
{
public void DoSomeThing(string key)
{
// How do get service based on key
}
}
Является ли шаблон Factory единственным вариантом здесь?
Update1
Я прочитал здесь статью, в которой показано, как использовать шаблон фабрики для получения экземпляров службы, когда у нас есть несколько попыток создания конкретизации. Однако это еще не полное решение. когда я _serviceProvider.GetService()
метод _serviceProvider.GetService()
я не могу вводить данные в конструктор. Например, рассмотрим этот пример
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
Как может _serviceProvider.GetService()
ввести соответствующую строку соединения? В Unity или любом другом МОК мы можем это сделать во время регистрации типа. Я могу использовать IOption, однако мне потребуется ввести все настройки, я не могу ввести конкретную строку подключения в службу.
Также обратите внимание, что я стараюсь избегать использования других контейнеров (включая Unity), потому что тогда мне нужно зарегистрировать все остальное (например, контроллеры) с новым контейнером.
Также использование фабричного шаблона для создания экземпляра службы против DIP, поскольку завод увеличивает количество зависимостей, которые клиент вынужден зависеть от данных здесь
Поэтому я думаю, что по умолчанию DI в ядре ASP.NET отсутствует 2 вещи
1> Регистрация экземпляров с использованием ключа
2> Вставлять статические данные в конструктор во время регистрации