2008-10-01 26 views
5

我是一個DI新手,所以請原諒我,如果這是一個錯誤的方法或一個愚蠢的問題。我應該如何訂購DI/IOC的ctor參數?

比方說,我有一個創建/更新訂單的表單,我知道它需要檢索要顯示的產品和客戶列表。我想傳遞它正在編輯的Order對象,但我也想注入ProductsService和CustomersService作爲依賴關係。

所以我會希望我的IoC容器(無論哪一個去)提供服務,但它將由調用代碼提供Order對象進行編輯。

我應該聲明構造爲接受定單對象作爲第一個參數,之後的系列技術CustomersService,如:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

...還是應該依賴於最後來到第一和訂單對象,例如:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

重要嗎?它取決於我使用哪個IoC容器?或者,還有更好的方法?

回答

4

我不同意@ aku的回答。

我認爲你在做什麼很好,還有其他方法可以做到沒有更多或更少的權利。例如,人們可能會質疑這個對象是否應該首先取決於服務。不管DI是什麼,我覺得在你的頭腦中至少要澄清每個對象所持有的狀態,比如真實狀態(Order),派生狀態(如果有的話)以及依賴關係(服務)是有幫助的:

http://tech.puredanger.com/2007/09/18/spelunking/

在任何構造函數或方法,我更喜歡真實的數據傳遞第一和依賴性或外部的東西最後被通過。所以在你的例子中,我更喜歡第一個。

5

馬特,你不應該混合正常參數和依賴關係。由於您的對象將在IoC容器的內部創建,您將如何指定必要的參數?

混合依賴和正常參數會使程序的邏輯更加複雜。

在這種情況下它會更好聲明依賴性性質(即移除構造的依賴關係)或初始化順序字段的IoC構造OrderForm和解決它的後依賴性(即,從構造除去正常參數)。

此外,您可以聲明所有參數,包括訂單作爲依賴關係。

+0

好的,這是有道理的。因此,無論是對所有依賴關係使用屬性注入,還是僅將依賴關係傳遞給ctor,併爲「必要」對象引入屬性? – 2008-10-01 05:22:15

+0

是的,你是對的。不要混用DP和普通屬性,因爲它可能導致不可預知的問題,並限制合適的IoC框架的範圍。 – aku 2008-10-01 05:27:22

3

我覺得有點讓人不安的是允許OrderForm的實例在沒有對Order實例的必需引用的情況下實例化。其中一個原因可能是這會阻止我對空訂單進行前期檢查。還有什麼想法?

我想我知道OrderForm對象只能通過Factory方法實例化,以確保在調用IoC框架後設置Order屬性,這可能會讓人感到舒服。