欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NopCommerce架構(gòu)分析(一)Autofac依賴(lài)注入類(lèi)生成容器

 更新時(shí)間:2016年04月07日 09:38:21   作者:WalsonTung  
本文介紹了NopCommerce中IOC框架Autofac的使用,Autofac是一款I(lǐng)OC框架,比較于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級(jí)性能上非常高。

NopCommerce為了實(shí)現(xiàn)松耦合的框架設(shè)計(jì)目的,使用了IOC框架:Autofac。據(jù)有人測(cè)試,Autofac是性能很好的IOC工具。

1、在IOC中,組件首先需要在IOC中注冊(cè),有通過(guò)配置文件注冊(cè)的。像Spring.net,也有通過(guò)特性注冊(cè)的,像StructureMap,也有通過(guò)代理來(lái)注冊(cè)的,像Autofac。但是IOC講究一個(gè)原則,就是接口和實(shí)現(xiàn)分離。所有IOC就是生命某個(gè)具體類(lèi)實(shí)現(xiàn)了某個(gè)接口。然后在使用時(shí),系統(tǒng)從IOC中獲取接口的實(shí)現(xiàn)類(lèi),并創(chuàng)建對(duì)象。

2、下面來(lái)看NopCommerce如何使用Autofac實(shí)現(xiàn)松耦合的框架設(shè)計(jì)的。其實(shí)它的插件機(jī)制也是通過(guò)Autofac來(lái)實(shí)現(xiàn)的。

IOC的封裝及靈活使用機(jī)制主要在Nop.Core.Infrastructure中封裝的。在Autofac中,對(duì)象又稱(chēng)為組件。組件生命周期分為:?jiǎn)卫?、臨時(shí)和生命周期域內(nèi),如下定義:

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

Autofac中有容器、并提供方法注冊(cè)接口及其類(lèi)型,還提供方法查找到注冊(cè)的類(lèi)型,以及自動(dòng)創(chuàng)建對(duì)象。

3、類(lèi)型查找器

為了支持插件功能,以及支持一些自動(dòng)注冊(cè)的功能。系統(tǒng)提供了類(lèi)型查找器。ITypeFinder以及實(shí)現(xiàn)類(lèi)就是提供此功能。通過(guò)類(lèi)型查找器可以查找本程序域中的類(lèi),也可以查找整個(gè)bin目錄下所有動(dòng)態(tài)鏈接庫(kù)中類(lèi),并把它們注冊(cè)到類(lèi)型反轉(zhuǎn)容器中。ITypeFinder以及實(shí)現(xiàn)類(lèi)如下:

4、類(lèi)型注冊(cè)

容器管理類(lèi):ContainerManager,管理通過(guò)Autofac生成的容器;

容器配置器:ContainerConfigurer:配置依賴(lài)反轉(zhuǎn)容器,建立整個(gè)框架的類(lèi)型依賴(lài)注冊(cè)和類(lèi)型查找類(lèi)之間的關(guān)系。

在系統(tǒng)中有一個(gè)依賴(lài)類(lèi)引擎上下文環(huán)境:EngineContext,可以根據(jù)配置文件生成引擎,此引擎是負(fù)責(zé)根據(jù)類(lèi)型接口從容器中返回對(duì)象。

系統(tǒng)默認(rèn)引擎NopEngine,若沒(méi)有配置有效的引擎,即用默認(rèn)引擎,生成的引擎保存在單例容器中。

它們的關(guān)系如下:

系統(tǒng)在類(lèi)MvcApplication的方法Application_Start中初始化引擎上下文。并通過(guò)調(diào)用EngineContext.Initialize(false);實(shí)現(xiàn)所有反轉(zhuǎn)依賴(lài)的注冊(cè)功能;

5、容器注冊(cè)類(lèi)

系統(tǒng)注冊(cè)接口為:IDependencyRegistrar,系統(tǒng)通過(guò)ContainerConfigurer注冊(cè)此接口以及實(shí)現(xiàn)類(lèi)的,并通過(guò)ITypeFinder類(lèi)搜尋程序集里實(shí)現(xiàn)接口IDependencyRegistrar的類(lèi)。代碼如下:

namespace Nop.Core.Infrastructure.DependencyManagement 
{ 
 /// <summary> 
 /// Configures the inversion of control container with services used by Nop. 
 /// </summary> 
 public class ContainerConfigurer 
 { 
  public virtual void Configure(IEngine engine, ContainerManager containerManager, EventBroker broker, NopConfig configuration) 
  { 
   //other dependencies 
   containerManager.AddComponentInstance<NopConfig>(configuration, "nop.configuration"); 
   containerManager.AddComponentInstance<IEngine>(engine, "nop.engine"); 
   containerManager.AddComponentInstance<ContainerConfigurer>(this, "nop.containerConfigurer"); 
 
   //type finder 
   containerManager.AddComponent<ITypeFinder, WebAppTypeFinder>("nop.typeFinder"); 
 
   //register dependencies provided by other assemblies 
   var typeFinder = containerManager.Resolve<ITypeFinder>(); 
   containerManager.UpdateContainer(x => 
   { 
    var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>(); 
    var drInstances = new List<IDependencyRegistrar>(); 
    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的內(nèi)容如下:

namespace Nop.Core.Infrastructure.DependencyManagement 
{ 
 public interface IDependencyRegistrar 
 { 
  /// <summary> 
  /// 此方法在通過(guò)ContainerBuilder注冊(cè)依賴(lài)關(guān)系。 
  /// </summary> 
  /// <param name="builder">容器管理者類(lèi)</param> 
  /// <param name="typeFinder">類(lèi)型查找者接口</param> 
  void Register(ContainerBuilder builder, ITypeFinder typeFinder); 
  /// <summary> 
  /// 注冊(cè)排序序號(hào) 
  /// </summary> 
  int Order { get; } 
 } 
}

6、單例類(lèi)容器

單例類(lèi)系列保存系統(tǒng)中與程序相同生命周期的單例對(duì)象,或者叫做單例類(lèi)容器。

其中包括實(shí)體類(lèi),集合類(lèi)和字典類(lèi)的單例容器。

Singleton<T>,SingletonList<T>,SingletonDictionary<TKey, TValue>。EngineContext就是通過(guò)Singleton<T>類(lèi)來(lái)管理引擎的。

7、MVC 服務(wù)提供類(lèi)。

類(lèi)型依賴(lài)獲取器:NopDependencyResolver,通過(guò)繼承mvc下的接口:IDependencyResolver,并在Application_Start方法中注冊(cè),使之在系統(tǒng)啟動(dòng)時(shí)調(diào)用。

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

8、其他

事件攔截類(lèi):EventBroker:過(guò)濾向系統(tǒng)發(fā)送的請(qǐng)求,防止由于臨時(shí)的錯(cuò)誤或異常導(dǎo)致系統(tǒng)崩潰。

系統(tǒng)啟動(dòng)時(shí)執(zhí)行任務(wù):IStartupTask,啟動(dòng)時(shí)執(zhí)行的任務(wù)主要是數(shù)據(jù)庫(kù)的初始化和加載。

相關(guān)文章

最新評(píng)論