2011-04-12 20 views
6

嗨,大家好,我希望聽到您在控制器級別和/或域名級別應用依賴注入時的主要優點和缺點。我應該在哪個級別應用依賴注入?控制器或域?

讓我解釋一下;如果收到一個IUserRepository作爲PARAM我用戶,我可以進行以下兩種方式:

1)I注入IUserRepository直接我的域對象上,然後我消耗用戶在控制器級別而不newing對象,這意味着,我從DI容器準備好它們。

2)我在我的控制器(比如說Register.aspx.cs)注入IUserRepository,並且在那裏我使用了來自DI容器的依賴的新的所有域對象。


昨天,當我說我的朋友,他告訴我,如果你從你失去它lifecicle控制容器讓你的域對象,如容器管理它適合你,他的意思是,它可能是容易出錯處理大型xml配置文件時。意見不一致,因爲你可能有一個循環遍歷程序集中每個域對象的測試,然後詢問容器是否是單例,請求範圍,會話範圍或應用程序範圍。如果其中任何一個都是真的,它就會失敗確保這種問題不會發生的一種方法。因爲我看到在控制器級別重複的代碼行上有很大的節省(當然在XML文件中會有更多的行),所以我更傾向於使用域方法(1)。

我的朋友玫瑰的另一點是,假設由於任何原因,你有義務從容器A更換爲B,並且說B不支持構造器注入(接縫容器的情況, Java,它操縱BC或者只通過setter注入完成它的任務),好的,他的觀點是,如果我將所有的代碼都放在控制器級別,我就可以平滑地重構我的代碼,因爲我可以訪問工具如自動重構和自動完成,這在處理XML文件時不可用。

我在這一點上陷入困​​境,因爲我應該立即做出決定。

哪種方法應該利用我的架構? 有沒有其他的思考方式?

你們是否真的認爲這是一個相關的問題,我應該擔心嗎?

+2

爲什麼用戶應該知道IUserRepository? – 2011-04-12 20:38:31

+0

因爲我完全決定我不會使用ANEMIC DOMAIN MODEL,所以我決定像.Save()或.Update()這樣的方法應該是實體本身的一部分,當然也要把這些努力委派給這些對象主要傾向於它,它意味着存儲庫。因爲我想以分離的方式工作,不讓我的應用成爲一個巨大的monolitic應用,我決定域定義它的存儲庫接口,而其他組合將由於使用它,因爲發生DI需要注入在我的域對象中使用具體的存儲庫實體(我在每個ctor中都使用guard子句) – renatoargh 2011-04-12 20:46:28

+0

@Renato Gama聽起來更像是一個活動記錄模式,可能對它有所幫助。當您需要服務時,我寧願看到IoC在工作,但不希望在創建實體時出現貧血。我認爲主動記錄模式通過某個單身人士到達實際的實體持有者。更多的是,保存和更新通常是實體的靜態方法,而不是實例方法。 – 2011-04-12 20:49:33

回答

5

如果你想避免貧血域模型你必須放棄傳統的n層,n層CRUDY應用程序體系結構。 Greg Young解釋了爲什麼在this paper on DDDD。 DI不會改變這一點。

CQRS會是一個更好的選擇,並且DI非常適合這種類型的體系結構傾向於產生的小型自治組件。

1

我沒有進入Java領域,但根據你的問題的細節,你似乎使用某種MVC框架(因爲你處理控制器和域)。但是我對如何在域驅動體系結構中使用DI有一些看法。

首先有幾種做DDD的方法:有些在演示中使用MVC,在MVC和Domain之間沒有應用服務層。其他使用MVP(或MVVM)並且沒有服務層。但我想有些人會同意我的看法,你很少注入存儲庫(或其他服務......)。我建議在命令(使用MVC和無服務層),Presenter(如果使用MVP)或應用程序服務(如果使用服務層)中注入存儲庫。我主要使用應用程序層,其中每個服務都會在構造函數中獲取它們需要注入的存儲庫。

第二我不會擔心在IoC容器之間切換。今天的大多數容器框架都支持ctor注入,並且可以自動解決參數。現在我知道你是Java開發人員,而且我是MS開發人員,但MS Practices團隊有一個通用服務定位器,可以幫助您生成與您使用的容器框架無關的代碼。在Java社區中可能有些類似。

所以去選項2.希望我把你推向正確的方向。