2011-12-27 64 views
0

我剛開始使用域驅動設計,並試圖將其應用於我當前的項目。域驅動開發:檢測更改(.NET)

我已經開始使用純粹的域模型,現在我的數據訪問層一直存在。我有一個完全自制的數據訪問層,因此在這裏不能使用任何已知的ORM工具。

我無法弄清楚如何處理更新。比方說,我有以下對象:

public class Document : Entity 
{ 
    public IPropertiesCollection Properties { get; set; } 

    public IContents Contents { get; set; } 
} 

public class PostalDocumentsPackage : Entity 
{ 
    public String Name { get; set; } 

    public DateTime DeliverDate { get; set; } 

    public ICollection<Document> Documents { get; set; } 
} 

我爲檢索對象(現在)相應的倉庫IDocumentsRepository和IPostalDocumentPackagesRepository。

我現在處理的問題是當我想添加一個新的文檔做PostalDocumentsPackage的Documents集合的情況。基本上我在這裏看到兩種可能的情況:

1)實現跟蹤原始集合中的更改並保存已更新\刪除的項目列表的集合。

2)在存儲庫中實現單獨的方法,用於向包中添加文檔。

我不知道這些方法是好的還是可能會導致未來的問題?或者有另一種選擇?

+0

男孩哦,男孩,恐怕你有很多工作爲你剪掉。在模型中使用實體和存儲庫不會使其成爲DDD。跟蹤文檔,而不是跟蹤文檔標識符。此外,由於您使用的是自定義持久性,因此請嘗試更多地封裝狀態。首先考慮一個對象的行爲,國家會遵循自然,我保證。 – 2011-12-28 01:22:12

+0

引用Jeff Atwood的話:「除非您計劃瞭解更多關於車輪的信息,否則不要重新發明車輪」。那麼,你在學習ORM嗎?如果不是,你爲什麼重新創建一個ORM? – autonomatt 2011-12-28 19:26:29

回答

0

通常情況下,更改跟蹤將由ORM(如NHibernate)處理。在您的情況下,您可以執行以下操作:

  • 根據標識屬性的值選擇新文檔。
  • 在重新插入表之前發出SQL刪除語句。

兩種方法的問題是文檔集合可能很大,因此爲每個文檔加載所有文檔可能是瓶頸。除了文檔集合之外,您還必須考慮是否需要對Document實體進行更改跟蹤。如果是這樣,那麼您還需要爲Document課程實施更改跟蹤。考慮到你沒有使用ORM,我會建議解決方案#2,因爲解決方案#1會引導你重新實現變更跟蹤,這會污染你的域類。您也可以考慮一個CQRS/Event Sourcing體系結構,其中明確更改跟蹤。