?IOC: Inversion Of Control 控制反转
?DI: Dependency Injection 依赖注入
讨论控制反转之前,先看看软件系统提出控制反转
的前世今生。
一个完整精密的软件系统,组件之间就像齿轮,协同工作,相互耦合。
软件专家为此提出IOC理论,用来实现对象之间的解耦。
再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:
有些人会把控制反转和依赖注入等同,实际上有本质区别:
控制反转是一种思想;依赖注入是一种设计模式。
依赖注入是实现控制反转的一种方式,但是控制反转还有其他实现方式,例如说ServiceLocator
(服务定位器、依赖查找),所以不能将控制反转和依赖注入等同。
依赖注入:容器全权负责组件的装配,它会把符合依赖关系的对象通过属性或者构造函数传递给需要的对象。
符合依赖倒置原则,高层模块不应该依赖低层模块,两者都应该依赖其抽象
使用方式大体类似:
①. 定义依赖实现的接口或者抽象类
②. 在服务容器中注册组件依赖 :IServiceProvider
③. 在构造函数中注入服务, 框架会负责创建和销毁实例
// 编写组件和服务 public interface IMyDependency { string WriteMessage(string message); } public class MyDependency : IMyDependency { public string WriteMessage(string message) { return $"MyDependency.WriteMessage Message: {message}"; } } ------ // 注册组件和依赖. public void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyDependency, MyDependency>(); services.AddControllersWithViews(); } -------- // 在构造函数注入组件 public class HomeController : Controller { private readonly IMyDependency _dep; public HomeController(IMyDependency dep) { _dep = dep; } public IActionResult Index() { var content = _dep.WriteMessage($"The Reflection instance is {_dep.GetType().FullName} "); return Content(content); } }
在请求某个服务时,框架会完整解析出这个对象的依赖树和作用范围。
上面的示例代码形成 req--->HomeController--->IMyDependency依赖树。
IMyDependency在每个web请求范围内使用同一服务实例。
输出:MyDependency.WriteMessage Message: The Reflection instance is TestDI.MyDependency
根据现实需要,前人从使用场景中总结出三种服务生命周期。
ASP.NET Core提供了一个枚举ServiceLifetime
:
-- | --- | --- | --- |
---|---|---|---|
Singleton | 单例 | 服务容器首次请求会创建,后续都使用同一实例 | AddSingleton |
Scoped | 特定范围 | 在一个请求(连接)周期内使用一个示例 | AddScoped |
Transient | 瞬时 | 服务容器每次请求,都会创建一个实例 | AddTransient |
对于Scoped Service
的理解:在webapp:scoped service 会在请求结束时被销毁;
在EFCore:使用AddDbContext默认注册的是特定范围的DbContext,这意味在我们可以在一次sql连接内,使用同一个DbContext实例进行多次DB操作。
结合理论、使用方式 猜测依赖注入的原理:
实现DI,核心在于依赖注入容器IContainer
,该容器具有以下功能
①.(容器)保存可用服务的集合
// 要用的特定对象、特定类、接口服务
②.(注册)提供一种方式将各种部件与他们依赖的服务绑定到一起;
// Add...函数或containerBuilder.Register函数
③.(解析点)为应用程序提供一种方式来请求已配置的对象:构造函数注入、属性注入.
运行时,框架会一层层通过反射构造实例,最终得到完整对象。
文章主要摘自:https://mp.weixin.qq.com/s/RzPcXNtFkp1BusbD-Mnh3g
原文:https://www.cnblogs.com/hobelee/p/13972520.html