現在,我有一個名爲StyleBundle的域實體。這StyleBundle採用樣式列表:DDD中對象驗證和持久性驗證的區別?
public class StyleBundle
{
public StyleBundle(List<Style> styles)
{
this.Styles = styles;
}
public IEnumerable<Style> Styles { get; private set;}
}
所以,在我原來的設計,一個StyleBundle不應該被一個空樣式列表中創建。這是一個領域專家基本上說是好的規則。
我寫這在構造函數中使用保護條款:
if (styles.Count() == 0)
throw new Exception("You must have at least one Style in a StyleBundle.");
這讓我可絕不處於無效狀態創建StyleBundle。我認爲這裏有一個例外是有道理的b/c在沒有至少一個Style的情況下創建的StyleBundle在系統中是例外的。
當然,在項目的其他部分,變化一直沿着這條路走下去,現在用戶可以創建一個沒有樣式的StyleBundle,但是不應該允許他們在沒有樣式的情況下保留一個StyleBundle。
所以現在我正在看我的守衛子句,並意識到我不能從構造函數拋出異常了。向前邁進,我有一個服務/應用程序層,當我們的代碼隱藏與StyleBundles一起工作時,它們與之交互。在我的服務層中,我有一個StyleBundleService類,並且該類向UI公開了基本功能......其中包括「CreateStyleBundle」。
看起來好像我必須讓服務層檢查StyleBundle在沒有任何樣式之前是否保留了數據庫,但是這個決定對我來說是「錯誤的」。
任何人遇到類似的事情?基本上,當「新起來」時對象的狀態是有效的狀態與持久性時相同對象的狀態不同?
謝謝! Mike
是存儲庫檢查實體的有效性是好還是壞的想法?對我而言,這聽起來很奇怪。但無論如何,我喜歡爲我的實體提供.IsValid想法。感謝您的反饋! – 2012-01-10 14:54:30
我不認爲您的存儲庫中的最新檢查是一個壞主意。否則,用戶可能會向數據庫添加一些無法捕獲的無效數據。就像Momamed Abed建議的那樣,你可以將它分成IsValid和IsValidForPersistence方法 – 2012-01-11 18:20:04