回头再学Asp.net系列--基础篇(六)
隨著面向?qū)ο蠓治雠c設(shè)計(jì)的發(fā)展,一個(gè)良好的設(shè)計(jì),核心原則之一就是將變化隔離,使得變化部分發(fā)生變化時(shí),不變部分不受影響(這也是OCP的目的)。為了做到這一點(diǎn),要利用面向?qū)ο笾械亩鄳B(tài)性,使用多態(tài)性后,客戶類不再直接依賴服務(wù)類,而是依賴于一個(gè)抽象的接口,這樣,客戶類就不能在內(nèi)部直接實(shí)例化具體的服務(wù)類。
但是,客戶類在運(yùn)作中又客觀需要具體的服務(wù)類提供服務(wù),因?yàn)榻涌谑遣荒軐?shí)例化去提供服務(wù)的。就產(chǎn)生了“客戶類不準(zhǔn)實(shí)例化具體服務(wù)類”和“客戶類需要具體服務(wù)類”這樣一對矛盾。
依賴注入(Dependency Injection),是這樣一個(gè)過程:由于某客戶類只依賴于服務(wù)類的一個(gè)接口,而不依賴于具體服務(wù)類,所以客戶類只定義一個(gè)注入點(diǎn)。在程序運(yùn)行過程中, 客戶類不直接實(shí)例化具體服務(wù)類實(shí)例,而是客戶類的運(yùn)行上下文環(huán)境或?qū)iT組件負(fù)責(zé)實(shí)例化服務(wù)類,然后將其注入到客戶類中,保證客戶類的正常運(yùn)行。
Setter注入(Setter Injection)是指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并設(shè)置一個(gè)Set方法作為注入點(diǎn),這個(gè)Set方法接受一個(gè)具體的服務(wù)類實(shí)例為參數(shù),并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員。構(gòu)造注入(Constructor Injection)是指在客戶類中,設(shè)置一個(gè)服務(wù)類接口類型的數(shù)據(jù)成員,并以構(gòu)造函數(shù)為注入點(diǎn),這個(gè)構(gòu)造函數(shù)接受一個(gè)具體的服務(wù)類實(shí)例為參數(shù),并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員。
上面提到的注入方式,都是客戶類被動(dòng)接受所依賴的服務(wù)類,這也符合“注入”這個(gè)詞。不過還有一種方法,可以和依賴注入達(dá)到相同的目的,就是依賴獲取。
可以看到,這種方法變被動(dòng)為主動(dòng),使得客戶類在需要時(shí)主動(dòng)獲取服務(wù)類,而將多態(tài)性的實(shí)現(xiàn)封裝到獲取點(diǎn)里面。獲取點(diǎn)可以有很多種實(shí)現(xiàn),也許最容易想到 的就是建立一個(gè)Simple Factory作為獲取點(diǎn),客戶類傳入一個(gè)指定字符串,以獲取相應(yīng)服務(wù)類實(shí)例。如果所依賴的服務(wù)類是一系列類,那么依賴獲取一般利用Abstract Factory模式構(gòu)建獲取點(diǎn),然后,將服務(wù)類多態(tài)性轉(zhuǎn)移到工廠的多態(tài)性上,而工廠的類型依賴一個(gè)外部配置,如XML文件。
不過,不論使用Simple Factory還是Abstract Factory,都避免不了判斷服務(wù)類類型或工廠類型,這樣系統(tǒng)中總要有一個(gè)地方存在不符合OCP的if…else或switch…case結(jié)構(gòu),這種缺 陷是Simple Factory和Abstract Factory以及依賴獲取本身無法消除的,而在某些支持反射的語言中(如C#),通過將反射機(jī)制的引入徹底解決了這個(gè)問題
依賴獲取(Dependency Locate)是指在系統(tǒng)中提供一個(gè)獲取點(diǎn),客戶類仍然依賴服務(wù)類的接口。當(dāng)客戶類需要服務(wù)類時(shí),從獲取點(diǎn)主動(dòng)取得指定的服務(wù)類,具體的服務(wù)類類型由獲取點(diǎn)的配置決定。
轉(zhuǎn)載于:https://www.cnblogs.com/dubing/articles/2220723.html
總結(jié)
以上是生活随笔為你收集整理的回头再学Asp.net系列--基础篇(六)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch【torchvision】
- 下一篇: 重写CListCtrl滚动条,遇到的问题