一.EngineContext初始化

nopCommerce應(yīng)用啟動時首先調(diào)用EngineContext.Initialize(false) 進(jìn)行初始化引擎,

并對IEngine接口進(jìn)行初始化。IEngine用于實現(xiàn)依賴注入和初始化工作。nop中使用Autofac進(jìn)行依賴注入。

你會發(fā)現(xiàn)nop中很多如:EngineContext.Current.Resolve<ICacheManager>();這樣的語句,該Resolve方法用于返回對應(yīng)接口的實例。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn) EngineContext.Initialize(false)

二.IEngine接口初始化

NopEngine實現(xiàn)IEngine接口,并在Initialize(NopConfig config)方法中對應(yīng)用進(jìn)行初始化工作。

同時使用Resolve方法返回對應(yīng)接口實例。

首先我們看下Initialize(NopConfig config)方法都做了什么。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

  1   public void Initialize(NopConfig config)  2         {  3             //register dependencies 注冊依賴項 nop 使用 Autofac進(jìn)行依賴注入  4             RegisterDependencies(config);  5   6             //register mapper configurations 注冊對象映射配置 nop 使用 AutoMapper進(jìn)行對象映射  7             RegisterMapperConfiguration(config);  8   9             //startup tasks 啟動任務(wù) 10             if (!config.IgnoreStartupTasks) 11             { 12                 RunStartupTasks(); 13             } 14  15         }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

1.調(diào)用RegisterDependencies(config)方法進(jìn)行依賴注入(IOC)初始化工作

我們先看看代碼

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

  1     /// <summary>  2         /// 使用AutoFac注冊依賴項   3         /// 遍歷所有的實現(xiàn)IDependencyRegistrar接口實例進(jìn)行注冊  4         /// Register dependencies  5         /// </summary>  6         /// <param name="config">Config</param>  7         protected virtual void RegisterDependencies(NopConfig config)  8         {  9             var builder = new ContainerBuilder(); 10  11             //dependencies 12             var typeFinder = new WebAppTypeFinder(); 13             builder.RegisterInstance(config).As<NopConfig>().SingleInstance(); 14             builder.RegisterInstance(this).As<IEngine>().SingleInstance(); 15             builder.RegisterInstance(typeFinder).As<ITypeFinder>().SingleInstance(); 16  17             //register dependencies provided by other assemblies 18             var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>(); 19             var drInstances = new List<IDependencyRegistrar>(); 20             foreach (var drType in drTypes) 21                 drInstances.Add((IDependencyRegistrar) Activator.CreateInstance(drType)); 22             //sort 23             drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); 24             foreach (var dependencyRegistrar in drInstances) 25                 dependencyRegistrar.Register(builder, typeFinder, config); 26  27             var container = builder.Build(); 28             this._containerManager = new ContainerManager(container); 29  30             //set dependency resolver 31             DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 32         }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

1.默認(rèn)使用Autofac依賴注入框架,因此首先創(chuàng)建ioc容器  var builder = new ContainerBuilder();

2.容器中注冊NopConfig,IEngine,ITypeFinder。

這里重點說下ITypeFinder接口,該接用于返回程序集,獲取某個接口所有實現(xiàn)類。該接口被廣泛用在 Nop Engine中。

WebAppTypeFinder類實現(xiàn)了ITypeFinder接口,會獲取所有”\bin”目錄下*.dll 程序集,并通過反射可以獲取到指定接口的實現(xiàn)類。

3.獲取所有IDependencyRegistrar接口實現(xiàn)類進(jìn)行初始化,再調(diào)用 Register方法在IOC容器中注冊類型及其實例,

最重要的一個實現(xiàn)類就是“Nop.Web.Framework\DependencyRegistrar.cs”,該實現(xiàn)類中將nop所需要的接口實現(xiàn)都注冊到ioc容器中。

我們在二次開發(fā)中可以創(chuàng)建IDependencyRegistrar的實現(xiàn)類添加自己的業(yè)務(wù)接口。如何注冊大家學(xué)習(xí)下Autofac框架進(jìn)一步了解。

下圖中列出了nop項目自帶的一些IDependencyRegistrar方法。

代碼中也可以直接使用 EngineContext.Current.Resolve<“接口”>()進(jìn)行調(diào)用,這種情況常用語視圖中。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

2.調(diào)用RegisterMapperConfiguration(config)方法進(jìn)行對象映射

還是先看代碼

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

  1 /// <summary>  2         /// AutoMapper為對象映射  3         /// 遍歷所有的實現(xiàn)IMapperConfiguration接口實例進(jìn)行注冊  4         /// Register mapping  5         /// </summary>  6         /// <param name="config">Config</param>  7         protected virtual void RegisterMapperConfiguration(NopConfig config)  8         {  9             //dependencies 10             var typeFinder = new WebAppTypeFinder(); 11  12             //register mapper configurations provided by other assemblies 13             var mcTypes = typeFinder.FindClassesOfType<IMapperConfiguration>(); 14             var mcInstances = new List<IMapperConfiguration>(); 15             foreach (var mcType in mcTypes) 16                 mcInstances.Add((IMapperConfiguration)Activator.CreateInstance(mcType)); 17             //sort 18             mcInstances = mcInstances.AsQueryable().OrderBy(t => t.Order).ToList(); 19             //get configurations 20             var configurationActions = new List<Action<IMapperConfigurationExpression>>(); 21             foreach (var mc in mcInstances) 22                 configurationActions.Add(mc.GetConfiguration()); 23             //register 24             AutoMapperConfiguration.Init(configurationActions); 25         }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

使用AutoMapper框架進(jìn)行對象映射,簡單些就是Dto與Model之間的轉(zhuǎn)換.

這里同樣使用ITypeFinder 獲取所有IMapperConfiguration的實現(xiàn)類,并在實現(xiàn)類中完成Dto與Model之間的映射關(guān)系。

同樣如果自行擴展IMapperConfiguration的實現(xiàn)類,nop在此也會自動進(jìn)行配置的。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

nop中只在Nop.Admin項目中使用AutoMapper進(jìn)行對象映射。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

而Nop.Web項目并沒有使用AutoMapper而是用擴展來實現(xiàn)的。

3.運行啟動任務(wù)

最后說下應(yīng)用啟動時運行啟動任務(wù)

在配置類NopConfig中IgnoreStartupTasks來控制是否啟動

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

  1  /// <summary>  2         /// 啟動時運行的任務(wù)任務(wù)  3         /// 遍歷所有實現(xiàn)IStartupTask接口的實例  4         /// Run startup tasks  5         /// </summary>  6         protected virtual void RunStartupTasks()  7         {  8             var typeFinder = _containerManager.Resolve<ITypeFinder>();  9             var startUpTaskTypes = typeFinder.FindClassesOfType<IStartupTask>(); 10             var startUpTasks = new List<IStartupTask>(); 11             foreach (var startUpTaskType in startUpTaskTypes) 12                 startUpTasks.Add((IStartupTask)Activator.CreateInstance(startUpTaskType)); 13             //sort 14             startUpTasks = startUpTasks.AsQueryable().OrderBy(st => st.Order).ToList(); 15             foreach (var startUpTask in startUpTasks) 16                 startUpTask.Execute(); 17         }

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xùn)

同樣使用ITypeFinder 來獲取所有 IStartupTask接口的實現(xiàn)類,并調(diào)用Execute()方法來執(zhí)行。

三.總結(jié):

NopEngine實現(xiàn)nop引擎,并通過Autofac,AutoMapper對nop進(jìn)行初始化。

ITypeFinder 接口很重要,因為nop擴展功能都依賴于它來實現(xiàn)。nop有很好的接口截止,大家進(jìn)行二次開發(fā)的時候進(jìn)行接口實現(xiàn)就可以了,nop會自動進(jìn)行初始化配置。

如果Autofac,AutoMapper中的配置不好理解可以留言一起討論學(xué)習(xí)。


本文地址:http://www.cnblogs.com/yaoshangjin/p/7221586.html 

本文為大波浪原創(chuàng)、轉(zhuǎn)載請注明出處。

如果您認(rèn)為這篇文章還不錯或者有所收獲,可以點擊下方的【關(guān)注】按鈕,因為你的支持是我繼續(xù)寫作,分享的最大動力!

作者:大波浪

來源:http://www.cnblogs.com/yaoshangjin/

聲明: 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。如果您發(fā)現(xiàn)博客中出現(xiàn)了錯誤,或者有更好的建議、想法,請及時與我聯(lián)系!!如果想找我私下交流,可以私信或者加我QQ。

http://www.cnblogs.com/yaoshangjin/p/7221586.html