一.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)接口的實例。
EngineContext.Initialize(false)
二.IEngine接口初始化
NopEngine實現(xiàn)IEngine接口,并在Initialize(NopConfig config)方法中對應(yīng)用進(jìn)行初始化工作。
同時使用Resolve方法返回對應(yīng)接口實例。
首先我們看下Initialize(NopConfig config)方法都做了什么。
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 }
1.調(diào)用RegisterDependencies(config)方法進(jìn)行依賴注入(IOC)初始化工作
我們先看看代碼
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 }
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)用,這種情況常用語視圖中。
2.調(diào)用RegisterMapperConfiguration(config)方法進(jì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 }
使用AutoMapper框架進(jìn)行對象映射,簡單些就是Dto與Model之間的轉(zhuǎn)換.
這里同樣使用ITypeFinder 獲取所有IMapperConfiguration的實現(xiàn)類,并在實現(xiàn)類中完成Dto與Model之間的映射關(guān)系。
同樣如果自行擴展IMapperConfiguration的實現(xiàn)類,nop在此也會自動進(jìn)行配置的。
nop中只在Nop.Admin項目中使用AutoMapper進(jìn)行對象映射。
而Nop.Web項目并沒有使用AutoMapper而是用擴展來實現(xiàn)的。
3.運行啟動任務(wù)
最后說下應(yīng)用啟動時運行啟動任務(wù)
在配置類NopConfig中IgnoreStartupTasks來控制是否啟動
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 }
同樣使用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