NopCommerce架構分析(一)Autofac依賴注入類生成容器
NopCommerce為了實現(xiàn)松耦合的框架設計目的,使用了IOC框架:Autofac。據(jù)有人測試,Autofac是性能很好的IOC工具。
1、在IOC中,組件首先需要在IOC中注冊,有通過配置文件注冊的。像Spring.net,也有通過特性注冊的,像StructureMap,也有通過代理來注冊的,像Autofac。但是IOC講究一個原則,就是接口和實現(xiàn)分離。所有IOC就是生命某個具體類實現(xiàn)了某個接口。然后在使用時,系統(tǒng)從IOC中獲取接口的實現(xiàn)類,并創(chuàng)建對象。
2、下面來看NopCommerce如何使用Autofac實現(xiàn)松耦合的框架設計的。其實它的插件機制也是通過Autofac來實現(xiàn)的。
IOC的封裝及靈活使用機制主要在Nop.Core.Infrastructure中封裝的。在Autofac中,對象又稱為組件。組件生命周期分為:單例、臨時和生命周期域內,如下定義:
namespace Nop.Core.Infrastructure.DependencyManagement
{
public enum ComponentLifeStyle
{
Singleton = 0,
Transient = 1,
LifetimeScope = 2
}
}
Autofac中有容器、并提供方法注冊接口及其類型,還提供方法查找到注冊的類型,以及自動創(chuàng)建對象。
3、類型查找器
為了支持插件功能,以及支持一些自動注冊的功能。系統(tǒng)提供了類型查找器。ITypeFinder以及實現(xiàn)類就是提供此功能。通過類型查找器可以查找本程序域中的類,也可以查找整個bin目錄下所有動態(tài)鏈接庫中類,并把它們注冊到類型反轉容器中。ITypeFinder以及實現(xiàn)類如下:
4、類型注冊
容器管理類:ContainerManager,管理通過Autofac生成的容器;
容器配置器:ContainerConfigurer:配置依賴反轉容器,建立整個框架的類型依賴注冊和類型查找類之間的關系。
在系統(tǒng)中有一個依賴類引擎上下文環(huán)境:EngineContext,可以根據(jù)配置文件生成引擎,此引擎是負責根據(jù)類型接口從容器中返回對象。
系統(tǒng)默認引擎NopEngine,若沒有配置有效的引擎,即用默認引擎,生成的引擎保存在單例容器中。
它們的關系如下:
系統(tǒng)在類MvcApplication的方法Application_Start中初始化引擎上下文。并通過調用EngineContext.Initialize(false);實現(xiàn)所有反轉依賴的注冊功能;
5、容器注冊類
系統(tǒng)注冊接口為:IDependencyRegistrar,系統(tǒng)通過ContainerConfigurer注冊此接口以及實現(xiàn)類的,并通過ITypeFinder類搜尋程序集里實現(xiàn)接口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、單例類容器
單例類系列保存系統(tǒng)中與程序相同生命周期的單例對象,或者叫做單例類容器。
其中包括實體類,集合類和字典類的單例容器。
Singleton<T>,SingletonList<T>,SingletonDictionary<TKey, TValue>。EngineContext就是通過Singleton<T>類來管理引擎的。
7、MVC 服務提供類。
類型依賴獲取器:NopDependencyResolver,通過繼承mvc下的接口:IDependencyResolver,并在Application_Start方法中注冊,使之在系統(tǒng)啟動時調用。
//set dependency resolver var dependencyResolver = new NopDependencyResolver(); DependencyResolver.SetResolver(dependencyResolver);
8、其他
事件攔截類:EventBroker:過濾向系統(tǒng)發(fā)送的請求,防止由于臨時的錯誤或異常導致系統(tǒng)崩潰。
系統(tǒng)啟動時執(zhí)行任務:IStartupTask,啟動時執(zhí)行的任務主要是數(shù)據(jù)庫的初始化和加載。
- NopCommerce架構分析之(八)多語言支持
- NopCommerce架構分析之(七)主題Theme皮膚管理器
- NopCommerce架構分析之(六)自定義RazorViewEngine和WebViewPage
- NopCommerce架構分析之(五)Model綁定Action參數(shù)
- NopCommerce架構分析之(四)基于路由實現(xiàn)靈活的插件機制
- NopCommerce架構分析之(三)EntityFramework數(shù)據(jù)庫初試化及數(shù)據(jù)操作
- 使用Nopcommerce為商城添加滿XX減XX優(yōu)惠券功能
- 基于nopCommerce的開發(fā)框架 附源碼
相關文章
MongoDB數(shù)據(jù)庫介紹并用.NET?Core對其進行編碼
這篇文章介紹了MongoDB數(shù)據(jù)庫并用.NET?Core對其進行編碼,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXml
ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之間的區(qū)別...2006-10-10
解讀ASP.NET 5 & MVC6系列教程(16):自定義View視圖文件查找邏輯
這篇文章主要介紹了ASP.NET 5 MVC6中自定義View視圖文件查找邏輯,需要的朋友可以參考下2016-06-06
決定何時使用 DataGrid、DataList 或 Repeater(ASP.NET 技術文章)
決定何時使用 DataGrid、DataList 或 Repeater(ASP.NET 技術文章)...2006-10-10
在ASP.NET 2.0中操作數(shù)據(jù)之十六:概述插入、更新和刪除數(shù)據(jù)
本文主要介紹ASP.NET中插入、更新和刪除數(shù)據(jù)的原理,ObjectDataSource在頁面和潛在的數(shù)據(jù)之間扮演一個代理的角色,配合業(yè)務邏輯可以執(zhí)行Select()、Insert()、Update()和Delete()方法。2016-05-05
ASP.NET MVC4入門教程(六):驗證編輯方法和編輯視圖
本文主要演示如何修改控制器和視圖以及處理POST的請求,以達到實現(xiàn)我們想要的功能。2016-04-04
[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程
本文主要是對Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)系列教程的一個索引的整理,方便大家查看全部的教程。2016-05-05
解讀ASP.NET 5 & MVC6系列教程(17):MVC中的其他新特性
這篇文章主要介紹了ASP.NET 5中全局導入、獲取IP相關信息、文件上傳等其他新特性,需要的朋友可以參考下2016-06-06
在ASP.NET 2.0中操作數(shù)據(jù)之六:編程設置ObjectDataSource的參數(shù)值
本文主要介紹在ObjectDataSource控件的Selecting事件中,設置InputParameters參數(shù),配合業(yè)務層的查詢方法,以達到查詢不同數(shù)據(jù)的目的。2016-04-04
在ASP.NET 2.0中操作數(shù)據(jù)之七十四:用Managed Code創(chuàng)建存儲過程和用戶自定義函數(shù)(下部分)
本文接著上篇主要講如何使用Managed Code創(chuàng)建用戶自定義函數(shù),Visual Studio的SQL Server Project類型可以很容易的創(chuàng)建、編譯、配置managed database objects,此外還支持多種調試.2016-05-05

