2010-07-28 67 views
3

我有一個域模型類型。其衆多屬性之一需要ITranslationService提供將其返回值轉換爲適當語言的能力。依賴注入域模型的技巧

我是否應該將ITranslationService注入到域模型類型的構造函數中(因此必須隨處更改類型實例化,並且在通過NhIbernate檢索時必須關注初始化),即使它被類型(許多屬性之一);還是有另一種功能模式可以使用?

有沒有人有任何相關經驗可以分享?

+0

檢查http://techblog.bozho.net/?p=180 – Bozho 2010-07-28 11:05:51

回答

0

我應該注入 ITranslationService到 構造域模型類型

是的,那可能是有意義的,根據您的情況。如果你總是避免將服務注入實體,那麼這可能導致anemic domain model這是一種反模式。

需要實例化實體的代碼可以通過使用工廠來屏蔽額外的構造函數參數,該工廠負責依賴注入。

的NHibernate也可以通過構造函數中注入服務的實體:http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html

+0

謝謝。最後我刪除了依賴關係cf Tomas,但我喜歡你的工廠討論。 – Ben 2010-07-28 11:53:13

4

我不希望域對象執行翻譯 - 而是使用帶有域對象(或相關屬性值)的翻譯服務作爲參數,並返回翻譯後的值。例如,你可以簡單地做

var translatedString = yourServiceInstance.Translate(theDomainObject.Property); 
+0

+1這是更好的。另一種設計聽起來像是違反了SRP。 – 2010-07-28 11:14:58

+0

我對你答案的理解是,你將翻譯服務的依賴關係轉移到方法的客戶端上?您的代碼看起來完全像屬性中的代碼。我的問題是提供依賴。一種可能性可能是將翻譯服務注入新的訪問方法。將訪問器/增變器方法對暴露爲nhibernate屬性是否直截了當? ......我覺得我的深度不夠 – Ben 2010-07-28 11:25:41

+0

@Ben:是的,將依賴項移動到使用域對象的對象,而不是在對象本身中。如果這是一個ASP.NET MVC Web應用程序,我可以將上面的代碼想象成控制器操作或視圖。這樣做的目標是讓你的域對象只保存數據,而其他人負責處理這些數據。 – 2010-07-28 11:38:25