参考
官方文档:在 ASP.NET Core 依赖注入 在 ASP.NET Core 中将依赖项注入到控制器
蒋金楠:书籍《ASP.NET Core 3框架揭秘》、博客园 :ASP.NET Core 3框架揭秘 、ASP.NET Core应用的7种依赖注入方式
MVC5依赖注入
概念
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
控制反转是一种思想,依赖注入是一种设计模式。
依赖注入优点
- 灵活且方便管理
- 不需要每个地方都进行实例化new一遍
- 接口与实现类在统一地方处理,如果有修改,只要修改注入类的实现类就好
- 解耦
- 把创建对象交给外部处理,不用自己创建对象
- 依赖抽象不依赖具体:例如在构造函数注入时只要注入接口就行,不需要锁定接口实现类
- 简单明了
- 从构造函数就能知道使用的是哪些接口
谁控制谁,控制什么
传统程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了
有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
服务生命周期
参考:
[ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期
一次性/临时性Transient
AddTransient:将 serviceType 中指定类型的暂时性服务添加到指定的 IServiceCollection 中。
作用域内Scoped
AddScoped:将 serviceType 中指定类型的范围内的服务添加到指定的 IServiceCollection 中
全局单例Singleton
AddSingleton:将 serviceType 中指定类型的单一实例服务添加到指定的 IServiceCollection 中。
项目中使用
- 统一地方把有依赖关系的类注册好:例如接口与实现类、抽象类与实现类、父类与子类
- 使用时通过构造函数注入,例如注入的是接口,直接调用接口方法,而不需要调用实现类
三种依赖注入方式
参考:[ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式
构造函数注入(推荐)
参考:构造函数概述
在有参构造函数中注入接口,代码如下:
public class StoreController : Controller { private IStoreService service; public StoreController(IStoreService service) { this.service = service; } }
属性注入(不推荐)
方法注入(配置时使用)
一个接口有多个实现类(依赖注入多个服务) 与 一个实现类有多个接口
参考:
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
在.NET Core中处理一个接口多个不同实现的依赖注入问题
如何在 ASP.NET Core DI 中注册具有多个接口的服务
ASP.NET Core 一个接口多个实现的依赖注入与动态选择
一个实现类可以继承多个接口
注入两次就好???
一个接口有多个实现类
一个接口注入多个服务,使用常规方法,只有最后的服务生效,可以通过工厂方式或者IEnumerable集合方式实现
ASP.NET Core中的依赖注入
在启动配置类中注入到容器中
在启动类Startup的服务注入方法ConfigureServices通过AddScoped<接口 , 实现类>的方式注入到容器,如:
services.AddScoped<ITeamService, TeamServiceImpl>();
在控制器的构造函数中使用
private readonly ITeamService teamService; public TeamsController(ITeamService teamService) { this.teamService = teamService; }
扩展
手写IOC