卓越于美,完胜于冠!
当前位置:技术中心/ 正文内容

技术中心

.Net Core的【根基】-依赖注入DI框架,全面解析

来源:西安美冠计算科技有限公司      发布时间:2024/8/2 12:47:28     浏览量:900

依赖注入(Dependency Injection,DI)是一种设计模式,它通过将对象之间的依赖关系的创建和维护转移到外部容器中来,以减少对象之间的紧耦合性和提高可重用性。

大家都知道,相比传统的.Net Framework,现代.Net Core拥有的核心升级便是DI依赖注入功能。

今天本文就对.Net Core中DI的各种应用方式,为大家做一个最全面的解析(赶快收藏)


一.第一个DI应用(服务、容器、注册、解析)
.Net Core自带的DI框架,存在于Microsoft.Extensions.DependencyInjection这个包中,故请先对其引用加载。

下面是一个最简单的示例,演示了创建容器、注册服务、解析服务等基本功能,大家注意看。

运行上述控制台程序,
输出:operatie1 executed

上述解析服务时,用的GetRequiredService方法,这个方法用于从DI容器中获取服务的实例。此处也可以用GetService这个方法替代它,它两类似,但它们之间有一个重要区别:当请求的服务未在DI容器中注册时,GetRequiredService会抛出一个异常,而GetService会返回null。

二.具有依赖关系的对象的创建、注册、及解析
下面的程序中,有Interface1、Interface2、Interface3、myInterface四个接口及其对应实现。其中myInterface的实现依赖于前三个接口。代码如下:



运行以上程序,输出如下:
MyFunction initial - I1+I2+I3
operatie1 executed
operatie2 executed
operatie3 executed

从上面代码我们可以看出,具有依赖关系的对象的创建,是在构造函数进行的依赖注入。DI框架明显简化了整个对象的创建过程,而且,对象们之间的依赖关系越复杂,这种简化的优势就越明显!

三.依赖注入构造函数的选择
从前面程序代码的执行输出结果,我们可以看到,DI框架在创建MyFunction对象时,使用的是MyFunction(Interface1 I1, Interface2 I2, Interface3 I3)这个构造函数。

如果我们把services.AddTransient();这行代码去掉,执行输出如下:
MyFunction initial - I2
operatie2 executed
此时DI框架在创建MyFunction对象时,使用的是MyFunction(Interface2 I2)这个构造函数。

如果我们把services.AddTransient();这行代码去掉,执行输出如下:
MyFunction initial - I1
operatie1 executed
此时DI框架在创建MyFunction对象时,使用的是MyFunction(Interface1 I1)这个构造函数。

如果我们把services.AddTransient();这行代码去掉,执行输出如下:
MyFunction initial - I1+I2
operatie1 executed
operatie2 executed

此时DI框架在创建MyFunction对象时,使用的是MyFunction(Interface1 I1, Interface2 I2)这个构造函数。

由此我们可推论出:DI框架会选择所有已注册类型的超集的构造函数来创建对象。

如果这个超集不存在,则程序会报错。
比如:我们把前面代码中MyFunction(Interface1 I1, Interface2 I2)这个构造函数给去掉,并且把services.AddTransient();这行代码也去掉。此时再运行程序,则会报错,提示构造函数存在模糊歧意。

接上面,如果在这个超集不存在的情况下,不希望程序报错,则可以指定DI框架只用其中一个构造函数进行对象的创建,需要做如下相应修改。
比如:我们就是要用MyFunction(Interface2 I2)这个构造函数来创建MyFunction对象,代码则需要做如下两个修改:
(1)在MyFunction(Interface2 I2)这个构造函数上添加[ActivatorUtilitiesConstructor]注释。
(2)把services.AddTransient();修改为services.AddTransient(p => ActivatorUtilities.CreateInstance(p));


四.一个接口注入多个实现类的处理
下面是一个接口Person,其有两个实现类Student与Teacher。




五.总结

本文是.Net Core中依赖注入DI框架在全网最详尽的一篇应用解析,它是你在.Net Core开发上的重要参考资料。望它能对您的成长及日常开发工作带来帮助。

  • 写在最后

现在推荐你一套高质量.NET/C#中大型项目开发宝典(已有人花1年时间学习后达到年薪百万)。市面上流行的什么多层架构、DDD领域驱动设计、分布式、负载均衡、AOP、微服务、通用权限平台、等等、里面都有涉及。