.Net Core 中同一接口多个实现依赖注入的问题

Posted shermanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net Core 中同一接口多个实现依赖注入的问题相关的知识,希望对你有一定的参考价值。

创建一个接口,然后提供两个实现的类

需要添加 Microsoft.Extensions.DependencyInjection nuget包的引用

 1 void Main()
 2 {
 3     var provider = new ServiceCollection()
 4     .AddScoped<ILogCore, NlogCore>()
 5     .AddScoped<ILogCore, SerilogCore>()
 6     .BuildServiceProvider();
 7 
 8 
 9     var nlog = provider.GetService<ILogCore>();
10     var serilog = provider.GetService<ILogCore>();
11     nlog.WriteLog();
12     serilog.WriteLog();
13 }
14 
15 public interface ILogCore
16 {
17     void WriteLog();
18 }
19 
20 public class NlogCore : ILogCore
21 {
22     public void WriteLog()
23     {
24         Console.WriteLine("Writing logs by nlog");
25     }
26 }
27 
28 public class SerilogCore : ILogCore
29 {
30     public void WriteLog()
31     {
32         Console.WriteLine("Writing logs by serilog");
33     }
34 }

运行结果如下:

Writing logs by serilog
Writing logs by serilog

按照上面的写法,看到的结果并不是我们想要的,这个后面的注入覆盖了前面的,那我们该如何做到一个接口的多个实现呢?可以对代码进行稍微的调整,利用另一个扩展的方法:

 1 void Main()
 2 {
 3     var provider = new ServiceCollection()
 4     .AddScoped<NlogCore>()
 5     .AddScoped<SerilogCore>()
 6     .AddScoped(factory =>
 7     {
 8         Func<string, ILogCore> accessor = key =>
 9         {
10 
11             if (key.Equals("nlog"))//根据传入的key值,然后返回相应的实现类的实例
12             {
13                 return factory.GetService<NlogCore>();
14             }
15             else if (key.Equals("serilog"))
16             {
17                 return factory.GetService<SerilogCore>();
18             }
19             else
20             {
21                 throw new ArgumentNullException($"{key} is not supported!");
22             }
23         };
24 
25 
26         return accessor;
27     })
28     .BuildServiceProvider();
29     
30     var logProvider = provider.GetService<Func<string, ILogCore>>();
31     var nlog = logProvider("nlog");
32     var serilog = logProvider("serilog");
33     nlog.WriteLog();
34     serilog.WriteLog();
35 }
36 
37 public interface ILogCore
38 {
39     void WriteLog();
40 }
41 
42 public class NlogCore : ILogCore
43 {
44     public void WriteLog()
45     {
46         Console.WriteLine("Writing logs by nlog");
47     }
48 }
49 
50 public class SerilogCore : ILogCore
51 {
52     public void WriteLog()
53     {
54         Console.WriteLine("Writing logs by serilog");
55     }
56 }

输出结果:

Writing logs by nlog
Writing logs by serilog

这个正是我们想要的结果,这是通过使用微软提供的IOC容器进行的依赖注入,如果换成Autofac又当如何实现呢?

Autofac版同一接口多个实现的依赖注入的解决方案

需要添加以下nuget包的引用:

Microsoft.Extensions.DependencyInjection

Autofac.Extensions.DependencyInjection

还是以上面的代码为例,直接上代码:

 1 void Main()
 2 {
 3     var collections = new ServiceCollection();
 4     var containerBuilder = new ContainerBuilder();
 5     containerBuilder.Populate(collections);
 6     containerBuilder.RegisterType<NlogCore>().Keyed<ILogCore>(LogTargetEnum.Nlog);
 7     containerBuilder.RegisterType<SerilogCore>().Keyed<ILogCore>(LogTargetEnum.Serilog);
 8     var container = containerBuilder.Build();
 9     var serivceProvider = new AutofacServiceProvider(container);
10 
11     var logProvider = serivceProvider.GetService<IIndex<LogTargetEnum, ILogCore>>();
12     var nlog = logProvider[LogTargetEnum.Nlog];
13     var serilog = logProvider[LogTargetEnum.Serilog];
14     
15     nlog.WriteLog();
16     serilog.WriteLog();
17 }
18 
19 public interface ILogCore
20 {
21     void WriteLog();
22 }
23 
24 public class NlogCore : ILogCore
25 {
26     public void WriteLog()
27     {
28         Console.WriteLine("Writing logs by nlog");
29     }
30 }
31 
32 public class SerilogCore : ILogCore
33 {
34     public void WriteLog()
35     {
36         Console.WriteLine("Writing logs by serilog");
37     }
38 }
39 
40 public enum LogTargetEnum
41 {
42     Nlog,
43     Serilog
44 }

 

输出结果:

Writing logs by nlog
Writing logs by serilog

也能达到我们想要的结果

当然也还有其他的方式达到我们的目的,其他的方式请大家自己摸索和学习,也可以在下面留言,大家共同学习和进步!

 

以上是关于.Net Core 中同一接口多个实现依赖注入的问题的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

ASP.NET Core依赖注入高级玩法——如何注入多个服务实现类

Asp.net Core AutoFac根据程序集实现依赖注入

ASP.NET Core依赖注入高级玩法——如何注入多个服务实现类

如何在 ASP.NET Core 中为同一接口配置不同的实现

.NET依赖注入之一个接口多个实现