千家信息网

NopCommerce中Autofac依赖注入类生成容器的示例分析

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍了NopCommerce中Autofac依赖注入类生成容器的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。No
千家信息网最后更新 2025年11月15日NopCommerce中Autofac依赖注入类生成容器的示例分析

这篇文章主要介绍了NopCommerce中Autofac依赖注入类生成容器的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac。据有人测试,Autofac是性能很好的IOC工具。

1、在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的。像Spring.net,也有通过特性注册的,像StructureMap,也有通过代理来注册的,像Autofac。但是IOC讲究一个原则,就是接口和实现分离。所有IOC就是生命某个具体类实现了某个接口。然后在使用时,系统从IOC中获取接口的实现类,并创建对象。

2、下面来看NopCommerce如何使用Autofac实现松耦合的框架设计的。其实它的插件机制也是通过Autofac来实现的。

IOC的封装及灵活使用机制主要在Nop.Core.Infrastructure中封装的。在Autofac中,对象又称为组件。组件生命周期分为:单例、临时和生命周期域内,如下定义:

namespace Nop.Core.Infrastructure.DependencyManagement {  public enum ComponentLifeStyle  {   Singleton = 0,   Transient = 1,   LifetimeScope = 2  } }

Autofac中有容器、并提供方法注册接口及其类型,还提供方法查找到注册的类型,以及自动创建对象。

3、类型查找器

为了支持插件功能,以及支持一些自动注册的功能。系统提供了类型查找器。ITypeFinder以及实现类就是提供此功能。通过类型查找器可以查找本程序域中的类,也可以查找整个bin目录下所有动态链接库中类,并把它们注册到类型反转容器中。ITypeFinder以及实现类如下:

4、类型注册

容器管理类:ContainerManager,管理通过Autofac生成的容器;

容器配置器:ContainerConfigurer:配置依赖反转容器,建立整个框架的类型依赖注册和类型查找类之间的关系。

在系统中有一个依赖类引擎上下文环境:EngineContext,可以根据配置文件生成引擎,此引擎是负责根据类型接口从容器中返回对象。

系统默认引擎NopEngine,若没有配置有效的引擎,即用默认引擎,生成的引擎保存在单例容器中。

它们的关系如下:

系统在类MvcApplication的方法Application_Start中初始化引擎上下文。并通过调用EngineContext.Initialize(false);实现所有反转依赖的注册功能;

5、容器注册类

系统注册接口为:IDependencyRegistrar,系统通过ContainerConfigurer注册此接口以及实现类的,并通过ITypeFinder类搜寻程序集里实现接口IDependencyRegistrar的类。代码如下:

namespace Nop.Core.Infrastructure.DependencyManagement {  ///   /// Configures the inversion of control container with services used by Nop.  ///   public class ContainerConfigurer  {   public virtual void Configure(IEngine engine, ContainerManager containerManager, EventBroker broker, NopConfig configuration)   {    //other dependencies    containerManager.AddComponentInstance(configuration, "nop.configuration");    containerManager.AddComponentInstance(engine, "nop.engine");    containerManager.AddComponentInstance(this, "nop.containerConfigurer");     //type finder    containerManager.AddComponent("nop.typeFinder");     //register dependencies provided by other assemblies    var typeFinder = containerManager.Resolve();    containerManager.UpdateContainer(x =>    {     var drTypes = typeFinder.FindClassesOfType();     var drInstances = new List();     foreach (var drType in drTypes)      drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType));     //sort     drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList();     foreach (var dependencyRegistrar in drInstances)      dependencyRegistrar.Register(x, typeFinder);    });     //event broker    containerManager.AddComponentInstance(broker);   }  } }

而接口IDependencyRegistrar的内容如下:

namespace Nop.Core.Infrastructure.DependencyManagement {  public interface IDependencyRegistrar  {   ///    /// 此方法在通过ContainerBuilder注册依赖关系。   ///    /// 容器管理者类   /// 类型查找者接口   void Register(ContainerBuilder builder, ITypeFinder typeFinder);   ///    /// 注册排序序号   ///    int Order { get; }  } }

6、单例类容器

单例类系列保存系统中与程序相同生命周期的单例对象,或者叫做单例类容器。

其中包括实体类,集合类和字典类的单例容器。

Singleton,SingletonList,SingletonDictionary。EngineContext就是通过Singleton类来管理引擎的。

7、MVC 服务提供类。

类型依赖获取器:NopDependencyResolver,通过继承mvc下的接口:IDependencyResolver,并在Application_Start方法中注册,使之在系统启动时调用。

//set dependency resolver var dependencyResolver = new NopDependencyResolver();DependencyResolver.SetResolver(dependencyResolver);

8、其他

事件拦截类:EventBroker:过滤向系统发送的请求,防止由于临时的错误或异常导致系统崩溃。

系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载。

感谢你能够认真阅读完这篇文章,希望小编分享的"NopCommerce中Autofac依赖注入类生成容器的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

容器 类型 系统 接口 引擎 生成 对象 配置 功能 就是 方法 框架 生命 篇文章 管理 周期 程序 组件 支持 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 刺激战场国际服测试服务器 期刊全文数据库有哪些异同 温州品牌网络技术咨询热线 大分子对接数据库 文件上传阿里云服务器 江苏省软件开发行业报告分析 网络安全的小组名 达梦数据库备份配置 软件服务器可以确认为无形资产吗 工程信息网络安全专业 服务器管理器添加硬盘 联想服务器sr590 国外网络安全意识 好用的局域网服务器软件 花生壳转发服务器与ip不一致 软件开发协议有什么区别 计算机网络技术需求量大吗 人啊人网络技术开发公司好吗 公安软件开发技术组工作职责 凝聚国家精神力量网络安全宣传 哪个不是网络安全建设的驱动力 蓝阔打印服务器西安经销商 在公司中需要的网络技术 软件开发公司新媒体怎样运营 mysql数据库论文 服务器与虚拟主机 临沭网络安全保卫大队 云服务器在电脑上就卡 数据库图书馆管理系统视图 按天租的服务器
0