第3章:依赖注入

学习分享 丨作者 / 郑 子 铭 丨公众号 / DotNet NB / CloudNative NB

任务16:介绍

1、依赖注入概念详解

  • 从UML和软件建模来理解

  • 从单元测试来理解

2、ASP.NET Core 源码解析

任务17:从UML角度来理解依赖

1、什么是依赖

当一个类A完成某个任务需要另一个类B来帮助时,A就对B产生了依赖

例如CustomerController需要对customer进行新增或查找时用到EF,则对EF的Context产生了依赖

var context = new CustomerContext(new DbContextOptions<CustomerContext>{});

2、显示依赖与隐式依赖

显示依赖:把一个类用到的所有外部组件放到一个类最上面,在构造函数里面初始化

private CustomerContext _context;

public CustomerController()
{
    _context = new CustomerContext(new DbContextOptions<CustomerContext>{});
}

隐式依赖:需要用到的地方再初始化,不推荐

3、依赖倒置原则

依赖高层业务,不依赖低层业务的具体实现,而依赖于具体的抽象

CustomerController是高层业务的一个组件,依赖于CustomerContext是一个低层数据库的实现,如果现在需要把EF换成一个内存的实现或者mysql,需要修改CustomerController类,风险很大,所以应该依赖于低层业务的抽象

把低层业务方法抽象,比如查找,新增,抽象出一个接口,当不需要使用EF的时候,使用内存的实现替换

任务18:控制反转

实现依赖注入的方式不由自己决定,而是交给一个IOC容器,需要什么由容器传入,比如生产环境需要使用EF,则由容器传入一个EfCustomerRepository,而测试环境需要使用内存级别的,则传入一个MemoryCustomerRepository

任务19:单元测试

通过单元测试可以得知修改Bug过程中是否误删代码,导致原来通过的测试现在无法通过。

任务20:DI初始化的源码解读

Microsoft.AspNetCore.Hosting.WebHostBuilder

第一步BuildCommonServices中new一个ServiceCollection就是在startup接口中使用

IStartup接口

第四步,webHost初始化方法Initialize

任务21:依赖注入的使用

了解ASP.NET Core 依赖注入,看这篇就够了:

http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/arrow-up-right

Last updated