AutoFac实现.Net控制反转
一.控制反转简介
涉入AutoFac,你应弄清楚什么是控制反转。控制反转(Inversion Of Control)顾名思义你可能会一头雾水,控制什么,反转什么?其实这里的控制,指的是组件实例之间的依赖关系,反转就是将依赖关系交给上级接口,实例化哪个对象让外部决定。
二.AutoFac出场
1.解决的问题-依赖
如上图所示,CD播放器因为有CD才能工作,所以称CD播放器依赖于CD。Microsoft官网上有3点分析依赖所带来的问题,我觉得概括得很好,在这里引用一下:
要用不同的实现替换依赖项,必须修改类。如果 具有依赖关系,则必须由类对其进行配置。 在具有多个需要依赖的类的大型项目中,配置代码在整个应用中会变得分散。这种实现很难进行单元测试。 应用应使用模拟或存根 MyDependency 类,该类不能使用此方法。
2.控制反转模式解决方案
依照开放关闭原则,对改变的部分进行封装,代码中抽象出连接池接口,对接口进行编程,而连接池实例由代码外部配置。
3.AutoFac实现思路
- 想要在你的app里构建控制反转的架构
- 添加Autofac的引用
- 在应用程序startup中…
- 创建一个ContainerBuilder
- 注册组件 构建并保存接下来需要用到的容器
- 在程序执行时…
- 从容器里创建一个生命期范围
- 使用这个生命周期去溶解组件的实例
4.AutoFac中的模型
组件就像溶质,用装了水的容器去溶解它们,构造顺序为:
容器构造器(注册组件,构造容器)=》 容器(用的时候溶解组件)=》组件,
代码如下:
var builder = new ContainerBuilder(); builder.RegisterType().As(); builder.RegisterType().As();//组件单个组册 builder.RegisterModule(new ConfigurationSettingsReader("autofacregist", registFile);//组件统一注册,参数autofacregist为组件组册所在的命名部分,registFile为组件配置路径,配置内容请看下文 Container = builder.Build();
组件统一配置文件如下:
5.AutoFac引用
在.net领域,AutoFac是IoC最好的实现。可以使用NutGet检索安装,也可以去Auto官网下载
6.使用tips
1.生命周期
容器本身就是一个生命周期
如果直接从容器中溶解组件,太多东西在容器中,你可能会因一些无所事事的组件等待处理而告终,出现内存溢出的问题。
取而代之的是:
从容器中创建一个子生命周期,并溶解它。在这个子生命周期的组件,当此子容器被处理时,一切都被处理掉。
using (var scope = Container.BeginLifetimeScope()) { var writer = scope.Resolve(); writer.WriteDate(); }
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系