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相关推荐

  1. 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)

    DIP,IoC与DI概念解析 依赖倒置 DIP(Dependency Inversion Principle) DIP的两大原则: 1.高层模块不应该依赖于低层模块,二者都应该依赖于抽象. 2.抽象不 ...

  2. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 "Inversion of Control".依赖注入DI, 全称 "Dependency Injection". 面向的问题:软件开发 ...

  3. 控制反转IOC与依赖注入DI

    为什么80%的码农都做不了架构师?>>>    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...

  4. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  5. ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)

    转载本文务必须注明出处.微信号(Yemeir_com).以及添加原文链接. 为什么要使用依赖注入 使用依赖注入(DI)可以使控制者与抽象实现者松耦合,便于单元测试.通过控制反转(IOC)的设计原理来减 ...

  6. 浅谈“面向接口编程” :依赖反转 IOC 与 DI (容器控制反转与依赖注入)

    IOC:Inversion of Control Containers and the Dependency Injection "Water" by Andy Huan, Mal ...

  7. 控制反转(IoC)与依赖注入(DI)详解

    文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...

  8. 控制反转IOC、依赖注入DI的详细说明与举例

    文章目录 引入 IOC介绍 IOC的实现 通过构造函数注入依赖 通过 setter 设值方法注入依赖 依赖注入容器 IOC优缺点 优点 缺点 阅读时忽略语言差异,参考了很多其他博主内容,参考博文在最后 ...

  9. 浅析Spring——控制反转IoC

    目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...

最新文章

  1. 个人在 laravel 开发中使用到的一些技巧(持续更新)
  2. Google全球三大数据中心自然冷却方案剖析
  3. tomcat服务器文件被清空,SpringBoot内置Tomcat缓存文件目录被意外删除导致异常
  4. 富文本编辑器的配置使用
  5. JAVA入门级教学之(第一章总结)
  6. 视频质量检测中的TP、FP、Reacll、Precision
  7. 中运用_钢琴教学中指法的安排与运用
  8. 使用rsync工具构建php项目管理平台
  9. dw二级联动下拉菜单插件 宋君墨_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
  10. android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
  11. scala下使用akka计算圆周率pi
  12. css如何设置div中的内容垂直居中?
  13. 遥感数字图像处理复习(朱文泉)
  14. python 直方图匹配_Python OpenCV 直方图匹配
  15. 图论(五)单源最短路算法
  16. 平面坐标转大地坐标(经纬度)
  17. 解决 Elasticsearch 查询时 Fielddata is disabled on text fields by default 错误
  18. 深度学习平台、CPU和GPU使用
  19. 【论文阅读】Efficient Reading of Papers in Science and Technology
  20. Ubuntu18.04.4安装与配置,让老机焕发青春

热门文章

  1. php mysql备份成sql_单php文件实现备份MySQL导出为.sql数据库代码
  2. c++运算符优先级_C语言入门教程-(6)运算符
  3. Window10设置护眼色
  4. aurora IP中选择了小端支持,但小端体现在了什么地方呢?
  5. GT Transceiver的动态重配置端口
  6. FPGA之道(60)时空变换之空域优化
  7. HDLBits 系列(34)Serial two's complememter(Mealy and Moore FSM)
  8. NAS设置NFS共享便于KODI添加视频的方式
  9. SQL SERVER 2005 同步复制技术(转)
  10. 2016年光伏系统成本将持续下降