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