从入门到放弃,.net构建博客系统(二):依赖注入
文章目錄:《從入門到放棄,.net構(gòu)建博客系統(tǒng)》
- 從入門到放棄,.net構(gòu)建博客系統(tǒng)(一):系統(tǒng)構(gòu)建
- 從入門到放棄,.net構(gòu)建博客系統(tǒng)(二):依賴注入
?
上一篇中有講到項(xiàng)目啟動(dòng)時(shí)會(huì)進(jìn)行ioc的依賴注入,但具體是怎么注入的呢?我們先一步步往下走
一、注冊(cè)autofac配置
首先bootstraper會(huì)進(jìn)行初始化,接著將當(dāng)前mvc控制器工廠改為AutofacControllerFactory。
1 public class AutofacConfig 2 { 3 /// <summary> 4 /// 負(fù)責(zé)調(diào)用autofac框架實(shí)現(xiàn)業(yè)務(wù)邏輯層和數(shù)據(jù)倉(cāng)儲(chǔ)層程序集中的類型對(duì)象的創(chuàng)建 5 /// 負(fù)責(zé)創(chuàng)建MVC控制器類的對(duì)象(調(diào)用控制器中的有參構(gòu)造函數(shù)),接管DefaultControllerFactory的工作 6 /// </summary> 7 public static void Register() 8 { 9 Bootstrapper boot = new Bootstrapper(); 10 boot.Start(); 11 12 //將MVC的控制器對(duì)象實(shí)例 交由autofac來(lái)創(chuàng)建 13 ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory()); 14 } 15 } View Code?
二、bootstraper開始注冊(cè)服務(wù)
在注冊(cè)服務(wù)前,我們先定義一個(gè)容器生成器ContainerBuilder,用以注冊(cè)服務(wù);接著我們會(huì)獲取當(dāng)前項(xiàng)目所有引用的程序集,對(duì)其中的類型進(jìn)行判斷,如果符合條件就會(huì)注冊(cè)進(jìn)去。那哪些類型會(huì)注冊(cè)進(jìn)去呢?
有三種:
1.?IDependency,倉(cāng)儲(chǔ)層和服務(wù)層的接口都繼承該接口,注冊(cè)的服務(wù)會(huì)在容器每次resolve的時(shí)候,生成一個(gè)新對(duì)象
2.?ISignleton,日志和緩存接口繼承該接口,每次解析都會(huì)返回統(tǒng)一對(duì)象,即單例對(duì)象
3.?Module,其中暴露了ContainerBuilder對(duì)象,由模塊自定義注冊(cè)方式,項(xiàng)目中webapp層有個(gè)MvcControllerModule,用于將所有實(shí)現(xiàn)IController給注冊(cè)進(jìn)去
1 public void Start() 2 { 3 Type baseType = typeof(IDependency); 4 5 // 獲取所有相關(guān)類庫(kù)的程序集 6 Assembly[] assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray(); 7 8 containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) 9 .AsImplementedInterfaces().InstancePerDependency();//每次解析獲得新實(shí)例 10 11 Type singletonType = typeof(ISignleton); 12 containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => singletonType.IsAssignableFrom(type) && !type.IsAbstract) 13 .AsImplementedInterfaces().SingleInstance();// 保證對(duì)象生命周期基于單例 14 15 containerBuilder.RegisterAssemblyModules(assemblies);//所有繼承module中的類都會(huì)被注冊(cè) 16 17 var container = containerBuilder.Build(); 18 ContainerManager.SetContainer(container); 19 } View Code依賴注冊(cè)好后,會(huì)生成IOC容器,接著將容器管理器的IOC容器設(shè)置為該容器,以后所有的服務(wù)的解析可以通過(guò)管理器來(lái)解析。
?
?三、自定義Autofac控制器工廠
第一步中我們將控制器工廠改為AutofacControllerFactory,這個(gè)控制器工廠重寫了GetControllerInstance,主要在解析控制器類型時(shí),用ContainerManager去解析控制器類型,這樣就能把控制器中的依賴給注入進(jìn)去。
1 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 2 { 3 if (controllerType == null) 4 { 5 return base.GetControllerInstance(requestContext, controllerType); 6 } 7 8 return ContainerManager.Resolve(controllerType) as IController; 9 } View Code?
demo:http://tonyblogs.top/
Git源碼:https://github.com/Halifa/TonyBlogs
如本文對(duì)您有幫助請(qǐng)移步右下角,推薦本文,謝謝大家的點(diǎn)贊,因?yàn)槟闹С质俏易畲髣?dòng)力
轉(zhuǎn)載于:https://www.cnblogs.com/shinly/p/7351799.html
總結(jié)
以上是生活随笔為你收集整理的从入门到放弃,.net构建博客系统(二):依赖注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mysql 索引-1
- 下一篇: 背水一战 Windows 10 (20)