Как зарегистрировать несколько реализаций одного и того же интерфейса в Asp.Net Core?
У меня есть службы, которые получены из того же интерфейса
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Как правило, другие контейнеры МОК, такие какUnity
позволяют регистрировать конкретные реализации некоторымиKey
это отличает их.
В Asp.Net Core, как мне зарегистрировать эти сервисы и разрешить их во время выполнения, основываясь на каком-то ключе?
Я не вижу ни одного изAdd
Сервисный метод занимает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
}
}
Шаблон фабрики - единственный вариант здесь?
Update1
Я прошел через статьюВот это показывает, как использовать фабричный шаблон для получения экземпляров сервисов, когда у нас есть множественная конкретная реализация. Однако это все еще не полное решение. когда я звоню_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> Внедрить статические данные в конструктор при регистрации