У меня есть услуги, которые являются производными от того же интерфейсаКак зарегистрировать несколько реализаций одного и того же интерфейса в 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
параметр, который обычно используется для различения конкретной реализации.
Есть ли заводская модель только здесь?
Update1
Я пошел, хотя в статье here, который показывает, как использовать фабричный шаблон, чтобы получить экземпляры служб, когда мы имеем несколько concreate реализации. Однако это еще не полное решение. когда я вызываю метод _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, как завод увеличивает количество зависимостей клиент вынужден зависеть от details here
Так что я думаю, что по умолчанию DI в ядре ASP.NET отсутствует 2 вещи
1> Регистрировать экземпляры с помощью ключа
2> Вставить статические данные в конструктор во время регистрации
Возможная Дубликат [Dependency инъекции разрешающего по имени] (http://stackoverflow.com/questions/39072001/dependency-injection -разъем по имени) –
Наконец-то есть [расширение в nuget] (https://www.nuget.org/packages/Neleus.DependencyInjection.Extensions) для регистрации на основе имени, надеюсь, что это может помочь – neleus
Привет, извините для моего глупого вопроса, но я о новинках с Microso ft.Extensions.DependencyInjection ... Считаете ли вы, что создаете 3 пустых интерфейса, которые расширяют Iservice, такие как «открытый интерфейс IServiceA: IService», а не «public class ServiceA: IServiceA» ... может быть хорошим вариантом? –