Lind.DDD.IoC(大(da)叔推薦)~在服務定(ding)位器(qi)中(zhong)引入IoC容器(qi)~容器(qi)的適配器(qi)
關于依賴倒置(DIP)
高層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)不依(yi)賴于低層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)的(de)實現(xian)(xian),而低層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)依(yi)賴于高層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)定義的(de)接(jie)口(kou),通俗的(de)講,就是高層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)定義接(jie)口(kou),低層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)負責實現(xian)(xian),這(zhe)在我們實際開(kai)發中經常(chang)被(bei)用(yong)到,層(ceng)(ceng)(ceng)(ceng)與層(ceng)(ceng)(ceng)(ceng)之間引(yin)用(yong),經常(chang)被(bei)添加一個接(jie)口(kou)層(ceng)(ceng)(ceng)(ceng)去隔離(li),在接(jie)口(kou)層(ceng)(ceng)(ceng)(ceng)定義相關業務規范,而底(di)層(ceng)(ceng)(ceng)(ceng)去實現(xian)(xian)它,高層(ceng)(ceng)(ceng)(ceng)只引(yin)用(yong)這(zhe)個接(jie)口(kou),當高級需(xu)要(yao)(yao)其它擴展(zhan),直接(jie)添加新的(de)接(jie)口(kou),由新的(de)底(di)層(ceng)(ceng)(ceng)(ceng)模(mo)(mo)塊(kuai)(kuai)去實現(xian)(xian)即(ji)可,底(di)層(ceng)(ceng)(ceng)(ceng)其它代碼不需(xu)要(yao)(yao)修(xiu)改,這(zhe)也完(wan)全復合開(kai)閉原則(OCP).
關于控制反轉(IOC)
控(kong)制反轉是一種(zhong)設(she)計模式(shi)(shi),像單例,工廠(chang),適(shi)合器都屬(shu)于設(she)計模式(shi)(shi)的一種(zhong),它是依賴倒(dao)置原則(ze)的具(ju)體實現,它告訴我(wo)們應該如何做(zuo),來解除相(xiang)互依賴模塊的耦合.
關于依賴注入(DI)
是IOC的(de)一(yi)種實現方式(shi),我們(men)經常說的(de)構造方法(fa)注入(ru),屬(shu)性注入(ru),接(jie)口(kou)注入(ru),指(zhi)的(de)就是DI,而我們(men)經過說的(de)unity,autofac,castle指(zhi)的(de)是DI的(de)框架(jia),即我們(men)的(de)IOC容器!
關于Lind.DDD.IoC容器
對于Lind.DDD.IoC模塊來(lai)說(shuo),主要(yao)(yao)實現(xian)的(de)(de)(de)功能是(shi)IoC和AoP,它(ta)在整個框架中都(dou)起(qi)到(dao)了(le)底層(ceng)支持的(de)(de)(de)作用,如你(ni)(ni)的(de)(de)(de)倉(cang)儲(chu)在生(sheng)產時(shi),需(xu)要(yao)(yao)用到(dao)IoC;你(ni)(ni)的(de)(de)(de)業(ye)務(wu)(wu)模塊根據一個規則(ze)實現(xian)了(le)多(duo)種策略,在生(sheng)產這(zhe)個業(ye)務(wu)(wu)模塊時(shi),需(xu)要(yao)(yao)用到(dao)IoC容器(qi),而這(zhe)個IoC容器(qi)可(ke)以通過服(fu)務(wu)(wu)定位(wei)器(qi)很(hen)方(fang)便找到(dao)你(ni)(ni)的(de)(de)(de)依賴關系,坦白(bai)的(de)(de)(de)說(shuo),對于所有對象的(de)(de)(de)生(sheng)產,都(dou)離不開服(fu)務(wu)(wu)定位(wei)器(qi).
關于服務定位器(ServiceLocator)
一個(ge)程(cheng)序集依賴(lai)別一個(ge)程(cheng)序集,我們(men)的服務(wu)定位器(qi)將幫(bang)助我們(men)在(zai)Bin目(mu)(mu)錄查找對(dui)應的依賴(lai)關系,幫(bang)我們(men)生(sheng)產(chan)對(dui)象;Lind.DDD里的服務(wu)定位器(qi)依賴(lai)了Lind的IocContainer,而新(xin)的IOC容(rong)器(qi)如果希(xi)望被服務(wu)定位器(qi)使用,我們(men)只(zhi)要實現IocContainer即可,這對(dui)于程(cheng)序的擴(kuo)展(zhan)性是有好處的,目(mu)(mu)前Lind.IoC只(zhi)集成了unity和autofac兩種IoC容(rong)器(qi).
關于Lind框架(jia)的IContainer
對所有(you)第三方IoC容器的抽象(xiang),它只實現(xian)了最一(yi)般的IoC方法(fa),如注(zhu)入(ru),反轉,是否被注(zhu)入(ru)等,具體看一(yi)下代碼
/// <summary> /// IoC容(rong)器規范 /// 作者(zhe):倉儲(chu)大(da)叔(shu) /// </summary> public interface IContainer { /// <summary> /// 反(fan)射成對(dui)象 /// </summary> /// <typeparam name="TService">接口類(lei)型</typeparam> /// <returns>具體類型(xing)</returns> TService Resolve<TService>(); /// <summary> /// 反射(she)成對象 /// </summary> /// <typeparam name="TService">接口類(lei)型(xing)</typeparam> /// <returns>具體類型</returns> object Resolve(Type type); /// <summary> /// 反(fan)射成(cheng)對象 /// </summary> /// <typeparam name="TService">接口類型</typeparam> /// <param name="overridedArguments">參數</param> /// <returns>具體(ti)類型</returns> TService Resolve<TService>(object overridedArguments); /// <summary> /// 反射成對(dui)象(xiang) /// </summary> /// <typeparam name="TService">接口類型</typeparam> /// <param name="overridedArguments">參數</param> /// <returns>具(ju)體類型</returns> object Resolve(Type serviceType, object overridedArguments); /// <summary> /// 注冊抽象(xiang)類(lei)型(xing)(xing)與具體(ti)實現(xian)的類(lei)型(xing)(xing) /// </summary> /// <param name="from">接口類型(xing)</param> /// <param name="to">具體類型(xing)</param> void RegisterType(Type from, Type to); /// <summary> /// 類(lei)型是否被注冊到IoC容(rong)器 /// </summary> /// <param name="type"></param> /// <returns></returns> bool IsRegistered(Type type); }
關于適配器模式
對(dui)(dui)于多種IoC容器的(de)統一,我們借用(yong)了(le)(le)適配(pei)器模(mo)式,新(xin)添加了(le)(le)適配(pei)器類去(qu)實(shi)(shi)現(xian)(xian)我們自己的(de)IContainer接口,在實(shi)(shi)現(xian)(xian)時,事(shi)實(shi)(shi)上是對(dui)(dui)原來第三方容器的(de)重寫,這種模(mo)式雖(sui)然添加了(le)(le)額外的(de)類對(dui)(dui)象,但(dan)實(shi)(shi)現(xian)(xian)了(le)(le)對(dui)(dui)現(xian)(xian)有功(gong)能的(de)擴(kuo)展(zhan).
關于框架級的工廠模式
工(gong)廠模(mo)式一(yi)般不去實現(xian),在業務層(ceng)直接使(shi)用(yong)ioc容器生(sheng)產(chan)對(dui)象(xiang)即可(ke),你(ni)使(shi)用(yong)工(gong)廠模(mo)塊(kuai),一(yi)般都會(hui)有對(dui)象(xiang)的(de)switch這種壞味(wei)道的(de)塊(kuai)出現(xian),但對(dui)于比較穩定的(de)框架對(dui)象(xiang)來說,使(shi)用(yong)工(gong)廠模(mo)式還是(shi)比較不錯(cuo)的(de)選(xuan)擇,因為(wei)你(ni)的(de)框架實現(xian)是(shi)比較固定的(de),所(suo)以可(ke)以使(shi)用(yong)switch來進行策略的(de)控制(zhi),從而(er)生(sheng)產(chan)指定的(de)對(dui)象(xiang),當然(ran)對(dui)于不滿足條件的(de),我們也應該手動throw出來,告訴開發(fa)人員.
結束語
希望大家都(dou)去自己寫C#的(de)框(kuang)架,而不是(shi)每次(ci)都(dou)依賴從java共(gong)享出來的(de)框(kuang)架,感覺味道(dao)怪(guai)怪(guai)的(de),難道(dao)C#程度員真的(de)這么懶呀!
哈哈!