博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
庖丁解牛Nop:控制反转--IOC和DI
阅读量:6940 次
发布时间:2019-06-27

本文共 2407 字,大约阅读时间需要 8 分钟。

  IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection);

  使用控制反转开发模式是先开发接口,然后再实现类。这种方法却可以有效的降低类之间的互相依赖的情况,不但能增加架构的弹性,也能有效的降低软件的复杂度。

 NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码:

//initialize engine contextEngineContext.Initialize(false); 从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。
Initialize()函数在EngineContext.cs中:如下图:
[MethodImpl(MethodImplOptions.Synchronized)]public static IEngine Initialize(bool forceRecreate)//传入的参数是false or true { if (Singleton
.Instance == null || forceRecreate) { var config = ConfigurationManager.GetSection("NopConfig") as NopConfig; Debug.WriteLine("Constructing engine " + DateTime.Now); Singleton
.Instance = CreateEngineInstance(config); Debug.WriteLine("Initializing engine " + DateTime.Now); Singleton
.Instance.Initialize(config); } return Singleton
.Instance; } NopEngine使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配 置的NopConfig节点信息 创建一个新的NopEngine实例,然后对该实例进行初始化操作。 web.config中的配置信息如下:
    
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

你可能感兴趣的文章
[ACM] POJ 3061 Subsequence (仿真足)
查看>>
[LeetCode]Maximum Product Subarray
查看>>
thinkphp 读取页面报错 说 /Runtime/Cache/Home/XXXXXX.php 错误
查看>>
第三届开源操作系统年度技术年会 --- 资料下载
查看>>
揭秘Windows10 UWP中的httpclient接口[2]
查看>>
Cookie的使用
查看>>
Jenkins和maven自动化构建java程序
查看>>
读取系统执行状态的shell脚本
查看>>
arcgis 10.1 导入数据到oracle 发布地图服务
查看>>
高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)
查看>>
znujljhzolktftcc
查看>>
高流量站点NGINX与PHP-fpm配置优化
查看>>
eclipse中改变默认的workspace的方法及说明
查看>>
一个基于MVVM的TableView组件化实现方案
查看>>
教你区分LVDS屏线及屏接口定义
查看>>
C函数tolower,与toupper
查看>>
c 进程间的通信
查看>>
【张宴】PHP在金山游戏运营中的应用
查看>>
tomcat发布静态网页
查看>>
python函数参数前面单星号(*)和双星号(**)的区别
查看>>