.NET中的依赖注入实际上帮助我们解耦了我们的代码,是控制反转和依赖反转原则的具体实现。

.Net Core的依赖注入的好处:

1. application 更稳定,容易维护和演化;

2. 实现细节的变化,不需要到处更改,在声明的时候进行替换即可;

3. 测试更容易,更好地mock依赖的service等。

4. 高级的模块或者服务不应该依赖于具体的实现,而是抽象。

服务的生命周期

1. Singleton: 应用程序运行期间是唯一的。需要考虑线程安全性,效率高

2. Scoped: 每个请求期间,实例唯一;需要考虑线程安全性,效率

3. Transient: 每次需要的时候实例化,不需要考虑线程安全,效率相对较低

关于服务的声明周期: 一个服务不应该依赖于比它生命周期短的服务。

我们通过 AddTransient,AddSingleton, AddScoped  可以完成大多数的场景需要;

serviceDescriptor 对象一般是隐含在直接调用的AddSingleton/AddTransient/AddScoped中的。

var serviceDescriptor = new ServiceDescriptor.Singleton<IServiceA, ServiceA>();

services.Add(serviceDescriptor);

=== 等价于

services.AddSingleto<IServiceA, ServiceA>();

ServiceCollection 复杂场景的使用

1. 同一个接口的不同实现,TryAdd

DI container 会按照注入顺序去resolve需要的接口实现,如下:

services.AddSingleton<IWeatherForecaster, WeatherForecaster>();
services.AddSingleton<IWeatherForecaster, AmazingWeatherForecaster>();
------- public ServiceA(private IWeatherForecaster _weather) {
}
_weather 实例化出来的 class 是typeof(AmazingWeatherForecaste), 按照我们在 ConfigureServices 中声明的顺序,最后一个起作用;


对ServiceCollection 的理解:serviceCollection是一个集合,里面包含了webhost加入的一些内置 ServiceDescriptors, 以及我们在configureservices 中声明的注入。
因此,本质上,我们对于这个servicecollection里面的操作可以参照集合的操作。

2. 取代接口的实现和移除接口的所有实现
Replace: 取代servicetype 的第一个实现,示例如下。
services.AddSingleton<IWeatherForecaster, WeatherForecaster>();
services.Replace(ServiceDescriptor.Singleton<IWeatherForecaster, AmazingWeatherForecaster>());

通过如上代码,我们在 service collection中只能找到  IWeatherForecaster 实现 只有 AmazingWeatherForecaster, 因为AmazingWeatherForecaster 取代了  WeatherForecaster。

 RemoveAll: 在service collection 中移除serviceType 的所有实现

3. 注册接口的多个实现

我们知道,在service collection中,是可以存在一个接口多个实现的注册信息的,那么我们有什么好的方法去注册一个接口的多个实现么? TryAddEnumerable

services.TryAddEnumerable(new[]
{
ServiceDescriptor.Singleton<ICourtBookingRule, ClubIsOpenRule>(),
ServiceDescriptor.Singleton<ICourtBookingRule, MaxBookingLengthRule>(),
ServiceDescriptor.Singleton<ICourtBookingRule, MaxPeakTimeBookingLengthRule>(),
}); === 等价于
services.TryAddEnumerable(ServiceDescriptor.Singleton<ICourtBookingRule, ClubIsOpenRule>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<ICourtBookingRule, MaxBookingLengthRule>());

4. 工厂模式

工厂模式允许我们在创建service 时候更加随心所欲, 拥有自己的掌控度。

services.TryAddSingleton<EmailNotificationService>();
services.TryAddSingleton<SmsNotificationService>(); services.AddSingleton<INotificationService>(sp =>
new CompositeNotificationService(
new INotificationService[]
{
sp.GetRequiredService<EmailNotificationService>(),
sp.GetRequiredService<SmsNotificationService>()
}));

例子中的使用场景是: 我们通过 CompositeNotificationService 去组合各种的 INotificationService, 因此使方不需要关心如何发notification 或者需要发送多少类型的notification。

------------------------

鉴于后续内容还有不少,关于在DI 使用时的注意事项,及引入第三方的依赖注入框架,剩下内容会更新在下一篇。欢迎大家讨论交流,指出不足,谢谢!

一、.Net Core 依赖注入详解及Autofac使用的更多相关文章

  1. Angular依赖注入详解

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  2. angularjs MVC、模块化、依赖注入详解

    一.MVC <!doctype html> <html ng-app> <head> <meta charset="utf-8"> ...

  3. spring 之 IOC 依赖注入详解

    当我们对一个javaBean进行实例化时,在原本的情况下我们会选择新建一个接口,然后进行实例化,为了进一步降低耦合度我们还会使用工厂模式进行封装. 例: 当我们想要去造,Chinese.America ...

  4. DI:依赖注入详解

    DI(依赖注入) 依赖注入的理解: 一般写程序的时候service层都需要用到dao层,所以一般都是在service层里面new  dao ,而现在利用依赖注入的方式,直接把dao给了service层 ...

  5. Asp.Net Core 依赖注入默认DI,Autofac注入

    使用默认DI 修改Startup类方法ConfigureServices如下: public void ConfigureServices(IServiceCollection services) { ...

  6. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  7. WPF依赖属性详解

    WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...

  8. net core 依赖注入问题

    net core 依赖注入问题 最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久 ...

  9. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

随机推荐

  1. 利用stat指令查看文件创建时间

    -shroot@test-W330-C30:/# stat * 文件:'b' 大小:4096 块:8 IO 块:4096 目录设备:802h/2050d Inode:5636097 硬链接:2权限:( ...

  2. k8s集群部署(2)

    一.利用ansible部署kubernetes准备阶段 1.集群介绍 基于二进制方式部署k8s集群和利用ansible-playbook实现自动化:二进制方式部署有助于理解系统各组件的交互原理和熟悉组 ...

  3. STM32的VDD与VDDA

    http://bbs.21ic.com/icview-1651072-1-1.html VDD VSS 就是平常的电源与地.后面带A的都是模拟量的电源.

  4. Python3冒泡排序

    练习:将路径为 D:\data.txt 的文件读取,并取出数字部分进行排序(不能使用内置排序方法),这里我们使用冒泡排序法 文件读取并取出数字部分(略) 一:什么叫冒泡排序 冒泡排序(Bubble S ...

  5. tkinter是内置的模块,不同的版本的导入形式不同,现总结如下

    #coding=utf-8 import os, sys try: from tkinter import * except ImportError: #Python 2.x PythonVersio ...

  6. Go语言安装配置

    一.Go语言下载 官方下载地址:https://golang.google.cn/dl/ 选择自己需要的版本下载即可. 二.Go语言安装 下载完成之后,双击go1.16.4.windows-amd64 ...

  7. Windows登录服务器CLI运行脚本出现 syntax error: unexpected end of file 错误的解决

    0.前言 通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我用的 ...

  8. 慢镜头变焦:视频超分辨率:CVPR2020论文解析

    慢镜头变焦:视频超分辨率:CVPR2020论文解析 Zooming Slow-Mo:  Fast and Accurate One-Stage Space-Time Video Super-Resol ...

  9. 将TVM集成到PyTorch上

    将TVM集成到PyTorch上 随着TVM不断展示出对深度学习执行效率的改进,很明显PyTorch将从直接利用编译器堆栈中受益.PyTorch的主要宗旨是提供无缝且强大的集成,而这不会妨碍用户.为此, ...

  10. SLAM相机定位

    SLAM相机定位 摘要 深度学习在相机定位方面取得了很好的结果,但是当前的单幅图像定位技术通常会缺乏鲁棒性,从而导致较大的离群值.在某种程度上,这已通过序列的(多图像)或几何约束方法解决,这些方法可以 ...