拥抱.NET Core系列:依赖注入(1)
2017-07-07 08:51
295 查看
依赖注入时编程手段中解耦和封装的一个非常重要的手段,我本人已经到了没有DI无法编写项目的程度了,在.NET Framework中微软并没有在FCL中引入DI,虽然推出了“Unity”。而在.NET Core中DI几乎是所有组件的标配可见DI有多么的重要,本节主要简单介绍下微软在.NET Core中加入的DI组件。
前言
DIP、IoC、DI
说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系。依赖倒置原则(DIP):软件设计原则,要依赖于抽象,不要依赖具体实现。
控制反转(IoC):一种实现DIP原则的模式。
依赖注入(DI):IoC的具体实现。
DIP就好比一个目标一个法则。
IoC就好比是论文,“应该怎么做才能遵循DIP”
DI就好比是实际的产品,“落实到具体的语言的工具”
关于这个比喻可能不是很准确,大家可以使用搜索引擎去了解更为详细的差异。
在.NET
在我接触的很多.NET项目中,很少有人使用DI,更别提像Orchard那样把DI用得出神入化。而复杂的代码很大一部分的原因是没有引入DI。在java中几乎从刚入门的新手都使用Spring提供的DI。依赖注入生命周期
生命周期是指对服务实例的存活状态控制,"Microsoft.Extensions.DependencyInjection"提供了一个枚举定义了三种生命周期状态。类型 | 描述 |
Singleton | 单例服务,从当前服务容器中获取这个类型的实例永远是同一个实例。 |
Scoped | 域内单例,为每个作用域创建一个服务实例,也就是说域内单例(域类似子容器)。 |
Transient | 瞬态,从服务容器中每获取一次创建一个新的实例。 |
用例服务
代码如下:
注册服务的N种姿势
其实可以很容易的看出,服务注册是通过创建一个“ServiceDescriptor”来完成的,而其它方式的注册只不过是基于一个方法的封装而已,让使用者可以更为方便的进行服务注册。
我们可以通过很多手段去注册一个服务,但这里推荐大家优先使用扩展方法进行服务注册,因为这样的代码更易读。反射循环注入时可以使用其它方式。服务使用
首先我们来看一下服务提供者提供的方法签名。可以发现与服务注册一样,基于同一个方法提供了很多扩展方法让使用者更加便捷的获取服务。
我们先来看“GetService<T>”与“GetRequiredService<T>”这两个方法。
这两个方法非常接近,唯一不同的是GetRequiredService会在找不到服务的时候抛出异常,而GetService在找不到服务时会返回null。
“GetServices”这个方法是用来获取多个服务实例,该方法会返回该类型注册的多个服务实例。我们来看个例子:
服务的生命周期
我们可以通过运行结果很好的理清各个生命周期的用意。下面用一张图来说明较复杂情况下“scope”的服务结果。
小技巧
注册支持延迟加载的服务
开发过程中经常有一种情况,服务A的A方法依赖了服务B,而服务A的B方法依赖了服务C,这时候你就得在构造函数上同时声明服务B和C,就像这样。这在其它DI组件中非常常见,比如autofac。而在现在我们需要这样做:
写在最后
.NET技术栈QQ群:384413261(点击加入.NET Group)相关文章推荐
- 拥抱.NET Core系列:依赖注入(2)
- 拥抱.NET Core系列:依赖注入(1)
- 解读ASP.NET 5 & MVC6系列(7):依赖注入
- Autofac全面解析系列(版本:3.5)–[依赖注入]
- 理解PHP依赖注入容器(dependency injection container)系列(三) Symfony服务容器介绍
- Spring整理系列(02)——spring依赖注入,组装对象之间的依赖关系
- SPRING系列一之 依赖注入
- Unity Application Block 1.0系列(5): 使用BuildUp让已存在对象实例也支持依赖注入
- 解读ASP.NET 5 & MVC6系列(7):依赖注入
- 从壹开始前后端分离【 .NET Core2.0 Api + Vue 2.0 + AOP + 分布式】框架之八 || API项目整体搭建 6.3 异步泛型+依赖注入初探
- AngularJS系列——双向绑定和依赖注入
- .net core 使用Autofac依赖注入
- 迈向angularjs2系列(5):依赖注入
- Spring系列之四——Spring IOC依赖注入
- NET Core 中的依赖注入
- Spring系列之-Spring IOC容器设计:依赖注入设计
- ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入
- .Net Core 依赖注入注入服务
- 很不错的关于依赖注入和AOP的系列文章