激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - NopCommerce架構(gòu)分析(一)Autofac依賴注入類生成容器

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

2020-01-02 14:02WalsonTung ASP.NET教程

本文介紹了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è),有通過配置文件注冊(cè)的。像Spring.net,也有通過特性注冊(cè)的,像StructureMap,也有通過代理來注冊(cè)的,像Autofac。但是IOC講究一個(gè)原則,就是接口和實(shí)現(xiàn)分離。所有IOC就是生命某個(gè)具體類實(shí)現(xiàn)了某個(gè)接口。然后在使用時(shí),系統(tǒng)從IOC中獲取接口的實(shí)現(xiàn)類,并創(chuàng)建對(duì)象。

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

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

?
1
2
3
4
5
6
7
8
9
namespace Nop.Core.Infrastructure.DependencyManagement
{
 public enum ComponentLifeStyle
 {
  Singleton = 0,
  Transient = 1,
  LifetimeScope = 2
 }
}

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

3、類型查找器

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

4、類型注冊(cè)

容器管理類:ContainerManager,管理通過Autofac生成的容器;

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

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

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

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

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

5、容器注冊(cè)類

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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)容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Nop.Core.Infrastructure.DependencyManagement
{
 public interface IDependencyRegistrar
 {
  /// <summary>
  /// 此方法在通過ContainerBuilder注冊(cè)依賴關(guān)系。
  /// </summary>
  /// <param name="builder">容器管理者類</param>
  /// <param name="typeFinder">類型查找者接口</param>
  void Register(ContainerBuilder builder, ITypeFinder typeFinder);
  /// <summary>
  /// 注冊(cè)排序序號(hào)
  /// </summary>
  int Order { get; }
 }
}

6、單例類容器

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

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

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

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

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

?
1
2
3
//set dependency resolver
var dependencyResolver = new NopDependencyResolver();
DependencyResolver.SetResolver(dependencyResolver);

8、其他

事件攔截類:EventBroker:過濾向系統(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ù)庫的初始化和加載。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲福利在线观看视频 | 黄色网址电影 | 精精国产xxxx视频在线播放7 | 久草视频福利在线观看 | 国产午夜精品久久久久 | 欧美一级黄 | 成人黄色一级电影 | 欧美视频一区二区三区四区 | 中文字幕精品一二三四五六七八 | 国产精品亚洲综合 | 国产免费传媒av片在线 | 97伦理 | 欧美日韩电影 | 中文字幕在线日韩 | 第一福利在线 | a一级黄色大片 | 草草免费视频 | 国产真实孩交 | 久久网页 | 婷婷久久综合九色综合色多多蜜臀 | 依依成人综合 | 色婷婷久久久 | 免费a级观看 | 日本免费一区二区三区四区 | 在线观看国产 | 国产精品中文在线 | 国产无遮挡一区二区三区毛片日本 | 在线男人天堂 | av在线在线 | 中文字幕在线播放视频 | 成人视屏在线 | 国产69精品久久久久久野外 | 久久久久久久久国产 | 欧美a在线播放 | av电影网在线观看 | 国产成视频在线观看 | 蜜桃视频在线免费观看 | chinese18 xxxx videos | 国产羞羞网站 | www日韩在线 | 永久免费毛片 |