庖丁解牛Nop:控制反转--IOC和DI
IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection);
使用控制反转开发模式是先开发接口,然后再实现类。这种方法却可以有效的降低类之间的互相依赖的情况,不但能增加架构的弹性,也能有效的降低软件的复杂度。
NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码:
//initialize engine context EngineContext.Initialize(false);从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。
Initialize()函数在EngineContext.cs中:如下图:
[MethodImpl(MethodImplOptions.Synchronized)] public static IEngine Initialize(bool forceRecreate)//传入的参数是false or true { if (Singleton<IEngine>.Instance == null || forceRecreate) { var config = ConfigurationManager.GetSection("NopConfig") as NopConfig; Debug.WriteLine("Constructing engine " + DateTime.Now); Singleton<IEngine>.Instance = CreateEngineInstance(config); Debug.WriteLine("Initializing engine " + DateTime.Now); Singleton<IEngine>.Instance.Initialize(config); } return Singleton<IEngine>.Instance; }NopEngine使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配 置的NopConfig节点信息创建一个新的NopEngine实例,然后对该实例进行初始化操作。 web.config中的配置信息如下:
<configSections> <section name="NopConfig" type="Easy.Core.Configuration.NopConfig, Easy.Core" requirePermission="false" /> </configSections> <NopConfig> <DynamicDiscovery Enabled="true" /> <Engine Type="" /> <Themes basePath="~/Themes/" /> </NopConfig>
CreateEngineInstance()函数的作用使用new NopEngine()创建了一个NopEngine实例,在NopEngine的构造函数处对Autofac的容器(Container)作了初始化
代码:public NopEngine(EventBroker broker, ContainerConfigurer configurer) {var config = ConfigurationManager.GetSection("NopConfig") as NopConfig; InitializeContainer(configurer, broker, config); }
private void InitializeContainer(ContainerConfigurer configurer, EventBroker broker, NopConfig config) {var builder = new ContainerBuilder(); _containerManager = new ContainerManager(builder.Build()); configurer.Configure(this, _containerManager, broker, config); }
NopCommerce通过ContainerManager对容器做了一层封装,方便对其他类型的IOC框架的扩充和支持。Configure函数完成了所有依赖的注入,同时查找所有实现了IDependencyRegistrar接 口的类,并调用其Register方法,注册内容包括Http context、web helper、controller、data layer、plugin、cache manager、work context、services、settings、event consumers等等。ContainerManager/ContainerConfigurer和IDependencyRegistrar是实现IOC的关键
ContainerManagerContainerManager对依赖注入中使用的容器做了一层封装,提供了这些函数:
- AddComponent/AddComponentInstance/AddComponentWithParameters
- Resolve/ResolveAll/ResovleUnregistered
- UpdateContainer
DependencyRegistrar:
- web helper
- controller
- data layer
- plugin
- cache manager
- work context
- services
- settings
- event consumer
转载于:https://www.cnblogs.com/SamVip/p/4743842.html
庖丁解牛Nop:控制反转--IOC和DI相关推荐
- 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)
DIP,IoC与DI概念解析 依赖倒置 DIP(Dependency Inversion Principle) DIP的两大原则: 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象. 2.抽象不 ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 "Inversion of Control".依赖注入DI, 全称 "Dependency Injection". 面向的问题:软件开发 ...
- 控制反转IOC与依赖注入DI
为什么80%的码农都做不了架构师?>>> 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...
- PHP依赖注入(DI)和控制反转(IoC)详解
这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...
- ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)
转载本文务必须注明出处.微信号(Yemeir_com).以及添加原文链接. 为什么要使用依赖注入 使用依赖注入(DI)可以使控制者与抽象实现者松耦合,便于单元测试.通过控制反转(IOC)的设计原理来减 ...
- 浅谈“面向接口编程” :依赖反转 IOC 与 DI (容器控制反转与依赖注入)
IOC:Inversion of Control Containers and the Dependency Injection "Water" by Andy Huan, Mal ...
- 控制反转(IoC)与依赖注入(DI)详解
文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...
- 控制反转IOC、依赖注入DI的详细说明与举例
文章目录 引入 IOC介绍 IOC的实现 通过构造函数注入依赖 通过 setter 设值方法注入依赖 依赖注入容器 IOC优缺点 优点 缺点 阅读时忽略语言差异,参考了很多其他博主内容,参考博文在最后 ...
- 浅析Spring——控制反转IoC
目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...
最新文章
- 个人在 laravel 开发中使用到的一些技巧(持续更新)
- Google全球三大数据中心自然冷却方案剖析
- tomcat服务器文件被清空,SpringBoot内置Tomcat缓存文件目录被意外删除导致异常
- 富文本编辑器的配置使用
- JAVA入门级教学之(第一章总结)
- 视频质量检测中的TP、FP、Reacll、Precision
- 中运用_钢琴教学中指法的安排与运用
- 使用rsync工具构建php项目管理平台
- dw二级联动下拉菜单插件 宋君墨_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
- android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
- scala下使用akka计算圆周率pi
- css如何设置div中的内容垂直居中?
- 遥感数字图像处理复习(朱文泉)
- python 直方图匹配_Python OpenCV 直方图匹配
- 图论(五)单源最短路算法
- 平面坐标转大地坐标(经纬度)
- 解决 Elasticsearch 查询时 Fielddata is disabled on text fields by default 错误
- 深度学习平台、CPU和GPU使用
- 【论文阅读】Efficient Reading of Papers in Science and Technology
- Ubuntu18.04.4安装与配置,让老机焕发青春
热门文章
- php mysql备份成sql_单php文件实现备份MySQL导出为.sql数据库代码
- c++运算符优先级_C语言入门教程-(6)运算符
- Window10设置护眼色
- aurora IP中选择了小端支持,但小端体现在了什么地方呢?
- GT Transceiver的动态重配置端口
- FPGA之道(60)时空变换之空域优化
- HDLBits 系列(34)Serial two's complememter(Mealy and Moore FSM)
- NAS设置NFS共享便于KODI添加视频的方式
- SQL SERVER 2005 同步复制技术(转)
- 2016年光伏系统成本将持续下降