2016-02-11 23 views
2

比方說,我有以下類和匕首模塊從維護的角度來看,實現屬性注入vs構造函數注入更爲優化嗎?

public class Base implements IBase { 
    private IDependency dependency; //IDependency is an interface 

    Base(IDependency dependency) { 
     this.dependency = dependency 
    } 
} 

public class SubClass extends Base implements ISubclass { 
    Base(IDependency dependency) { 
     super(dependency) 
    } 
} 

@Module 
public class MyModule { 

    // Let's assume some other class use SubClass and requires this 
    @Provides 
    ISubclass providesSubclass(IDependency dependency) { 
     return new SubClass(dependency); 
    } 
} 

如果我添加了新的參數Base構造,我得去MyModule和修改提供了方法,包括這個新的參數(除了obviusly換款BaseSubclass構造器)。在我看來,使用propery注入我沒有這個問題,因爲我沒有使用任何構造函數。

我的感覺是我可能做錯了什麼或者我有一些概念錯誤。我更喜歡構造函數注入屬性注入,但現在我不得不向40個其他類使用的基類添加一個構造函數參數,不僅需要修改這40個類構造函數,還必須修改模塊以反映新的構造函數參數。

我錯過了什麼嗎?我是否正確,如果我說做構造函數注入我會寫更少的代碼和維護將更容易?

+0

[通過構造函數或屬性設置器的依賴注入?](http://stackoverflow.com/questions/1503584/dependency-injection-through-constructors-or-property-setters) – rghome

回答

1

是的,你錯過了一些很棒的功能:你仍然可以在這種情況下使用構造函數注入!而且你甚至不必自己寫。

如果可以提供所有的依賴關係,匕首可以並將爲您創建對象。既然你可以提供IDependency你只需要修改類似下面的代碼:

public class SubClass extends Base implements ISubclass { 

    @Inject // Don't forget the annotation! 
    public Base(IDependency dependency) { 
     super(dependency) 
    } 
} 

@Module 
public class MyModule { 

    @Provides 
    ISubclass providesSubclass(SubClass subclass) { 
     return subclass; 
    } 
} 

提供的界面,但你您的實現依賴提供它。 Dagger將解決這個問題,並且你可以隨意地將許多參數添加到構造函數中。 (除了你已經指出的實際構造函數的明顯變化)

不要忘記@Inject註釋!