Dependence Injection
生活随笔
收集整理的這篇文章主要介紹了
Dependence Injection
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Dependence Injection (依賴注入)這一名詞在幾天前我還沒有聽說(shuō)過(guò),第一次看到她是在自己拿到《程序員》2005第一期的時(shí)候在一篇“依賴倒置、控制反轉(zhuǎn)、依賴注入”的文章中看到的。今天花了點(diǎn)時(shí)間看了看Martin fowler的Inversion of Control Containers and the Dependency Injection pattern,收獲不小,對(duì)以前學(xué)J2EE時(shí)對(duì)容器實(shí)現(xiàn)的疑惑也有了一點(diǎn)理解,如果工作時(shí)間允許的話,下一步也想花點(diǎn)時(shí)間研究一下幾個(gè)開源容器的實(shí)現(xiàn),在這方面有經(jīng)驗(yàn)的兄弟們望不吝賜教:)
??????? 其實(shí)無(wú)論IoC還是依賴注入,都是為了滿足面向?qū)ο笤O(shè)計(jì)的依賴倒置原則,依賴注入所注入的對(duì)象通常是個(gè)可變因素,所以如果不采用注入的手法,那只能在調(diào)用者內(nèi)部進(jìn)行強(qiáng)行的持有對(duì)象的實(shí)例,正如在以前的一篇State模式與Strategy模式 中所述的在State模式一樣,因?yàn)榄h(huán)境可能是一直在變的,那么如果我們想要實(shí)現(xiàn)操作隨環(huán)境的變化而產(chǎn)生不同的行為的話,在環(huán)境類中持有具體狀態(tài)實(shí)例是不可行的(具體狀態(tài)模式參見狀態(tài)模式),因?yàn)樗`反了“依賴于抽象,而不依賴與抽象的實(shí)現(xiàn)”的設(shè)計(jì)原則。所以采取的方式如下:
????
????/**////?<summary>
????///?狀態(tài)模式的環(huán)境類,用與控制狀態(tài)間的轉(zhuǎn)換
????///?</summary>
????public?class?Context
????{
????????private?State?state;
????????/**////?<summary>
????????///?環(huán)境的初始化
????????///?</summary>
????????///?<param?name="initState">初始化狀態(tài)</param>
????????public?Context(State?initState)
????????{
????????????this.state=initState;
????????}
????????/**////?<summary>
????????///?環(huán)境類所維護(hù)的狀態(tài)屬性
????????///?</summary>
????????public?State?State
????????{
????????????get
????????????{
????????????????return?this.state;
????????????}
????????????set
????????????{
????????????????this.state=value;
????????????}
????????}
????????/**////?<summary>
????????///?環(huán)境接口
????????///?</summary>
????????public?void?ContextIterface()
????????{
????????????Console.WriteLine("State?Context?Interface?called");
????????????this.state.MainCalculateLogic();
????????}
????}
??????? 在上面的代碼中,State是一個(gè)抽象類,所有狀態(tài)的實(shí)現(xiàn)均繼承自該類,所以在可變的環(huán)境類(即上面代碼中的Context類)中依賴關(guān)系是在Context類以及State類之間,在這里依賴注入體現(xiàn)在了構(gòu)造函數(shù)中傳入一個(gè)狀態(tài)對(duì)象,這種依賴注入的方式稱之為構(gòu)造子注入(Constructor Injection),后通過(guò)一個(gè)State屬性來(lái)實(shí)現(xiàn)設(shè)置注入依賴(Setter Injection)。當(dāng)然這兩種依賴注入方式可能結(jié)合起來(lái)使用,適用的情況是實(shí)現(xiàn)方式復(fù)雜多變、而且會(huì)發(fā)生來(lái)回的遷移,比如狀態(tài)模式。如果只是單純?yōu)榱丝蓴U(kuò)展,為了消除代碼的Bad Smell情況那么個(gè)人認(rèn)為用構(gòu)造子依賴注入即可,比如在策略模式中的使用,見拙文策略模式以及策略模式與模板方法的結(jié)合 ,還有另外一中依賴注入方式叫接口注入(Interface Injection)但個(gè)人感覺用起來(lái)不是很直觀也稍顯煩瑣。?
??????? 其實(shí)我個(gè)人的理解還顯得很稚嫩,歡迎大家指點(diǎn):)
??????? 其實(shí)無(wú)論IoC還是依賴注入,都是為了滿足面向?qū)ο笤O(shè)計(jì)的依賴倒置原則,依賴注入所注入的對(duì)象通常是個(gè)可變因素,所以如果不采用注入的手法,那只能在調(diào)用者內(nèi)部進(jìn)行強(qiáng)行的持有對(duì)象的實(shí)例,正如在以前的一篇State模式與Strategy模式 中所述的在State模式一樣,因?yàn)榄h(huán)境可能是一直在變的,那么如果我們想要實(shí)現(xiàn)操作隨環(huán)境的變化而產(chǎn)生不同的行為的話,在環(huán)境類中持有具體狀態(tài)實(shí)例是不可行的(具體狀態(tài)模式參見狀態(tài)模式),因?yàn)樗`反了“依賴于抽象,而不依賴與抽象的實(shí)現(xiàn)”的設(shè)計(jì)原則。所以采取的方式如下:
????
????/**////?<summary>
????///?狀態(tài)模式的環(huán)境類,用與控制狀態(tài)間的轉(zhuǎn)換
????///?</summary>
????public?class?Context
????{
????????private?State?state;
????????/**////?<summary>
????????///?環(huán)境的初始化
????????///?</summary>
????????///?<param?name="initState">初始化狀態(tài)</param>
????????public?Context(State?initState)
????????{
????????????this.state=initState;
????????}
????????/**////?<summary>
????????///?環(huán)境類所維護(hù)的狀態(tài)屬性
????????///?</summary>
????????public?State?State
????????{
????????????get
????????????{
????????????????return?this.state;
????????????}
????????????set
????????????{
????????????????this.state=value;
????????????}
????????}
????????/**////?<summary>
????????///?環(huán)境接口
????????///?</summary>
????????public?void?ContextIterface()
????????{
????????????Console.WriteLine("State?Context?Interface?called");
????????????this.state.MainCalculateLogic();
????????}
????}
??????? 在上面的代碼中,State是一個(gè)抽象類,所有狀態(tài)的實(shí)現(xiàn)均繼承自該類,所以在可變的環(huán)境類(即上面代碼中的Context類)中依賴關(guān)系是在Context類以及State類之間,在這里依賴注入體現(xiàn)在了構(gòu)造函數(shù)中傳入一個(gè)狀態(tài)對(duì)象,這種依賴注入的方式稱之為構(gòu)造子注入(Constructor Injection),后通過(guò)一個(gè)State屬性來(lái)實(shí)現(xiàn)設(shè)置注入依賴(Setter Injection)。當(dāng)然這兩種依賴注入方式可能結(jié)合起來(lái)使用,適用的情況是實(shí)現(xiàn)方式復(fù)雜多變、而且會(huì)發(fā)生來(lái)回的遷移,比如狀態(tài)模式。如果只是單純?yōu)榱丝蓴U(kuò)展,為了消除代碼的Bad Smell情況那么個(gè)人認(rèn)為用構(gòu)造子依賴注入即可,比如在策略模式中的使用,見拙文策略模式以及策略模式與模板方法的結(jié)合 ,還有另外一中依賴注入方式叫接口注入(Interface Injection)但個(gè)人感覺用起來(lái)不是很直觀也稍顯煩瑣。?
??????? 其實(shí)我個(gè)人的理解還顯得很稚嫩,歡迎大家指點(diǎn):)
轉(zhuǎn)載于:https://www.cnblogs.com/Masterpiece/archive/2005/01/24/96416.html
總結(jié)
以上是生活随笔為你收集整理的Dependence Injection的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 又新增三款Skin
- 下一篇: 在我的网站上开通了WebPart演示和下