Подход, который вы в настоящее время используете с ServiceFactory
, по сути является абстрактной фабрикой, поскольку вы инкапсулируете создание связанного набора объектов в методе.
Существует несколько различных способов, которыми вы можете добиться аналогичных результатов с внедрением зависимости. Одно из основных преимуществ, которое вы получили бы от этого, заключается в том, что вам больше не нужно вручную создавать какие-либо из ваших классов обслуживания. Вот несколько примеров использования. NET Core DI framework:
Регистрация фабричного делегата
Вы можете зарегистрировать Func<string, IService>
, который будет принимать строку и возвращать экземпляр IService
:
services.AddTransient<Func<string, IService>>(sp => name =>
name switch
{
"A" => sp.GetService<ServiceA>(),
"B" => sp.GetService<ServiceB>(),
_ => throw new NotImplementedException()
});
Затем вы можете внедрить Func<string, IService>
как зависимость везде, где вам нужно использовать фабрику.
Создать фабричный класс
Если вы хотите фабричный код в своем собственном классе, а не в регистрации DI, вы можете создать простой класс, который принимает экземпляр IServiceProvider
.
public interface IServiceFactory
{
IService GetService(string name);
}
public class ServiceFactory : IServiceFactory
{
private readonly IServiceProvider _provider;
public ServiceFactory(IServiceProvider provider)
{
_provider = provider;
}
public IService GetService(string name) =>
name switch
{
"A" => _provider.GetService<ServiceA>(),
"B" => _provider.GetService<ServiceB>(),
_ => throw new NotImplementedException()
};
}
. При этом вам нужно только зарегистрировать эти типы. И тогда вы можете вводить IServiceFactory
по мере необходимости.