[ASP.NET Core]ASP.NET Core 如何注册并使用基于同一个接口的不同的实现类?

ASP.NET Core 作者: Rector 10阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在ASP.NET Core应用程序开发中,依赖注入(Dependency Injection,简称DI)是经常被使用到的一种解耦方式,而DI是基于接口及其对应的实现的。在同一个接口只有一个实现类的情况下,我们通常可以通过ASP.NET Core的Startup.cs中的ConfigureServices使用类似services.AddScoped<IMyDependency, MyDependency>();来注入,然后在需要使用服务的类中调用接口即可。

但如果一个接口有多个实现类,这时又应该如何注入这个接口的多个实现,并且又该如何分别调用这个实现类呢?

比如当前有接口:

public interface IService{}

分别有如下的三个实现类:

public class ServiceA : IService { }
public class ServiceB : IService { } 
public class ServiceC : IService { }

方案一

使用Func委托实现依赖注入,如下:

services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<ServiceC>();

services.AddTransient<Func<string, IService>>(serviceProvider => key =>
{
    switch(key)
    {
        case "A":
            return serviceProvider.GetService<ServiceA>();
        case "B":
            return serviceProvider.GetService<ServiceB>();
        case "C":
            return serviceProvider.GetService<ServiceC>();
        default:
            throw new KeyNotFoundException();
    }
});

调用示例:

public class Consumer
{
    private readonly Func<string, IService> _serviceAccessor;

    public Consumer(Func<string, IService> serviceAccessor)
    {
        _serviceAccessor = serviceAccesor;
    }

    public void UseServiceA()
    {
        //调用上面注册的服务关键字(A,B,C)为调用相应的实现类
        _serviceAccessor("A").DoIServiceOperation();
    }
}

方案二

另外一种方案是使用命名空间Microsoft.Extensions.DependencyInjection是的扩展方法GetServices(),注册服务如下:

services.AddSingleton<IService, ServiceA>();
services.AddSingleton<IService, ServiceB>();
services.AddSingleton<IService, ServiceC>();

然后在需要使用服务的地方使用IServiceProviderGetServices()方法,如下:

var services = serviceProvider.GetServices<IService>();
var serviceB = services.First(o => o.GetType() == typeof(ServiceB));

如果IService接口中定义了一个Name的属性,我们还可依据Name属性的值来获取不同的接口实现服务,如下:

var serviceZ = services.First(o => o.Name.Equals("Z"));

阅读了该文章的人还浏览了...

本文永久链接码友网 » [ASP.NET Core]ASP.NET Core 如何注册并使用基于同一个接口的不同的实现类?

发布于: 2018-10-26 10:10:43
分享扩散: