2011-01-26 33 views
2

我讀過DDD書(埃裏克埃文斯),需要在演示文稿中使用的過程應該移動到服務類。例如BankAccountManagementService具有ChangeBankAccount,GetByAccountId ...方法。域對象封裝:靜態方法vs服務類

但是我需要封裝一些屬性的setter以禁止從其他業務對象分配它們。由於C#沒有友好的類,所以在服務的情況下不可能使用這種類型的封裝。但是可以使用BankAccount業務對象的靜態方法來完成。

(1)在上述原因使用服務的情況下,您如何解決此限制?

編輯:另一個問題

(2)爲什麼它是不好用靜態方法,而不是服務?我可以將它們放在單獨的部分類文件中,以便不將proc代碼與實體代碼混合。

感謝提前:)

回答

6

如果域對象的屬性不應設置(不變),然後讓他們的私人(或保護)。

負責更改域對象的私有屬性的服務方法將執行必要的驗證和/或權限檢查,並通過其構造函數之一(包括其id)創建一個新對象,其中包含要更改的屬性以及保存該對象。

另一種選擇是在你的域對象上設置一個方法,它接受新值和某種類型的權限對象,或者將該方法賦予特定的權限。這樣你可以限制從哪裏調用這個集合。

編輯: 讓事情變成靜態是一個建築黑洞: 你不能從它們繼承或以任何方式改變它們。 它使不可能使用依賴注入。 版本更難;一旦你制定了靜態和使用,就很難扭轉這一決定。 此外,您的靜態方法今天可能不會使用實例數據,但它可能在將來需要。

當方法是實例方法時,可以使用多態和泛型,創建一個通用的ServiceBase類並在其中放置常用的方法。

+0

感謝您的回答,但是爲什麼不使用靜態方法而不是沒有任何問題的服務? – Danil 2011-01-26 11:45:34