嗨,大家好,我希望聽到您在控制器級別和/或域名級別應用依賴注入時的主要優點和缺點。我應該在哪個級別應用依賴注入?控制器或域?
讓我解釋一下;如果收到一個IUserRepository作爲PARAM我用戶,我可以進行以下兩種方式:
1)I注入IUserRepository直接我的域對象上,然後我消耗用戶在控制器級別而不newing對象,這意味着,我從DI容器準備好它們。
2)我在我的控制器(比如說Register.aspx.cs)注入IUserRepository,並且在那裏我使用了來自DI容器的依賴的新的所有域對象。
昨天,當我說我的朋友,他告訴我,如果你從你失去它lifecicle控制容器讓你的域對象,如容器管理它適合你,他的意思是,它可能是容易出錯處理大型xml配置文件時。意見不一致,因爲你可能有一個循環遍歷程序集中每個域對象的測試,然後詢問容器是否是單例,請求範圍,會話範圍或應用程序範圍。如果其中任何一個都是真的,它就會失敗確保這種問題不會發生的一種方法。因爲我看到在控制器級別重複的代碼行上有很大的節省(當然在XML文件中會有更多的行),所以我更傾向於使用域方法(1)。
我的朋友玫瑰的另一點是,假設由於任何原因,你有義務從容器A更換爲B,並且說B不支持構造器注入(接縫容器的情況, Java,它操縱BC或者只通過setter注入完成它的任務),好的,他的觀點是,如果我將所有的代碼都放在控制器級別,我就可以平滑地重構我的代碼,因爲我可以訪問工具如自動重構和自動完成,這在處理XML文件時不可用。
我在這一點上陷入困境,因爲我應該立即做出決定。
哪種方法應該利用我的架構? 有沒有其他的思考方式?
你們是否真的認爲這是一個相關的問題,我應該擔心嗎?
爲什麼用戶應該知道IUserRepository? – 2011-04-12 20:38:31
因爲我完全決定我不會使用ANEMIC DOMAIN MODEL,所以我決定像.Save()或.Update()這樣的方法應該是實體本身的一部分,當然也要把這些努力委派給這些對象主要傾向於它,它意味着存儲庫。因爲我想以分離的方式工作,不讓我的應用成爲一個巨大的monolitic應用,我決定域定義它的存儲庫接口,而其他組合將由於使用它,因爲發生DI需要注入在我的域對象中使用具體的存儲庫實體(我在每個ctor中都使用guard子句) – renatoargh 2011-04-12 20:46:28
@Renato Gama聽起來更像是一個活動記錄模式,可能對它有所幫助。當您需要服務時,我寧願看到IoC在工作,但不希望在創建實體時出現貧血。我認爲主動記錄模式通過某個單身人士到達實際的實體持有者。更多的是,保存和更新通常是實體的靜態方法,而不是實例方法。 – 2011-04-12 20:49:33