У меня есть службы, которые получены из того же интерфейса.
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 of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by 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 или любой другой библиотеке IoC мы можем сделать это при регистрации типа. Я могу использовать IOption , что потребует от меня ввода всех настроек. Я не могу вставить конкретную строку подключения в службу.
Также обратите внимание, что я стараюсь избегать использования других контейнеров (включая Unity), потому что тогда я должен зарегистрировать все остальное (например, Controllers) в новом контейнере.
Кроме того, использование фабричного шаблона для создания экземпляров сервиса противоречит DIP, так как это увеличивает количество зависимостей, которые клиент имеет здесь. .
Итак, я думаю, что в стандартном DI в ASP.NET Core отсутствуют две вещи:
- Возможность регистрации экземпляров с помощью ключа
- Возможность вставлять статические данные в конструкторы при регистрации
Update1
быть перенесен на другой вопрос, так как внедрение вещей в конструкторы сильно отличается от разработки, какой объект построить