使用抽象工厂设计模式在 ASP.NET Core MVC 上实现依赖注入的多种实现

问题描述 投票:0回答:1

我想通过 .NET Core 中的抽象工厂访问特定接口的多个实现。根据提供的枚举,应返回正确的实现。这是我当前的代码:

public enum ServiceInstanceEnum { SampleE, SampleD }

// MyServiceFactory
public ISampleC CreateService(ServiceInstanceEnum serviceType)
{
    switch (serviceType)
    {
        case ServiceInstanceEnum.SampleE: return new SampleE();
        case ServiceInstanceEnum.SampleD: return new SampleD();
        default: throw new Exception($" The service is not exist...");
    }
}

我在 Startup.cs 上的服务注入

services.AddScoped<IMyServiceFactory, MyServiceFactory>();
services.AddScoped<ISampleC, SampleD>();
services.AddScoped<ISampleC, SampleE>();

控制器

private readonly ISampleC _sampleC;

public WeatherForecastController(
    ILogger<WeatherForecastController> logger,
    IMyServiceFactory myServiceFactory)
{
    _logger = logger;
    _sampleC = myServiceFactory.CreateService(ServiceInstanceEnum.SampleD);
}

问题是我当前的 MyServiceFactory 实现手动创建服务,而我希望它们由 DI 容器创建和管理。

asp.net-core dependency-injection multiple-instances asp.net-core-middleware abstract-factory
1个回答
0
投票

让您的

MyServiceFactory
取决于
IServiceProvider
:

public class MyServiceFactory(IServiceProvider container) : IMyServiceFactory
{
    public ISampleC CreateService(ServiceInstanceEnum serviceType)
    {
        switch (serviceType)
        {
            case ServiceInstanceEnum.SampleE:
                return container.GetRequiredInstance<SampleE>();
            case ServiceInstanceEnum.SampleD:
                return container.GetRequiredInstance<SampleD>();
            default: throw new Exception($" The service is not exist...");
        }
    }   
}

services.AddScoped<IMyServiceFactory, MyServiceFactory>();
services.AddScoped<SampleD>();
services.AddScoped<SampleE>();
© www.soinside.com 2019 - 2024. All rights reserved.