中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

NopCommerce中Autofac依賴注入類生成容器的示例分析

發布時間:2021-09-16 15:36:07 來源:億速云 閱讀:123 作者:小新 欄目:開發技術

這篇文章主要介紹了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 
{ 
 /// <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的內容如下:

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

6、單例類容器

單例類系列保存系統中與程序相同生命周期的單例對象,或者叫做單例類容器。

其中包括實體類,集合類和字典類的單例容器。

Singleton<T>,SingletonList<T>,SingletonDictionary<TKey, TValue>。EngineContext就是通過Singleton<T>類來管理引擎的。

7、MVC 服務提供類。

類型依賴獲取器:NopDependencyResolver,通過繼承mvc下的接口:IDependencyResolver,并在Application_Start方法中注冊,使之在系統啟動時調用。

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

8、其他

事件攔截類:EventBroker:過濾向系統發送的請求,防止由于臨時的錯誤或異常導致系統崩潰。

系統啟動時執行任務:IStartupTask,啟動時執行的任務主要是數據庫的初始化和加載。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“NopCommerce中Autofac依賴注入類生成容器的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双柏县| 长兴县| 冷水江市| 视频| 阜宁县| 信丰县| 泊头市| 长岭县| 黑龙江省| 尚义县| 曲麻莱县| 射洪县| 新民市| 高陵县| 北票市| 黔西县| 宝坻区| 平原县| 灵川县| 英超| 抚远县| 乐业县| 泸西县| 安塞县| 报价| 巴塘县| 平武县| 桑日县| 玛沁县| 华宁县| 祁阳县| 文登市| 稷山县| 博湖县| 米脂县| 濮阳县| 育儿| 龙川县| 杭锦后旗| 习水县| 大同市|