2015-09-14 20 views
0

實現DDD聚合時,我通常會公開表示業務功能的方法,然後這些功能負責修改內部狀態。例如。如何在不依賴持久層的情況下實現DDD Aggregates

public class Order 
{ 
    public int Id { get; private set; } 
    public IEnumerable<LineItem> LineItems { get; private set; } 

    public void AddLineItem(...) {...} 
    public void Ship() {...} 
    public void Cancel() {...} 
} 

當使用EF6或NHibernate的這個效果很好,因爲上下文/會話可以檢測到所有插入/刪除/子實體的更新。但是,對於EF7,我需要明確指示更改跟蹤器瞭解這些更改。例如。當AddLineItem()向LineItems集合添加了新的訂單項時,我們必須手動將其添加到上下文中的DBSet,或通知更改跟蹤器該訂單項的狀態爲Added

這意味着我的域對象必須對實體框架有明確的依賴關係,並且我現在必須以某種方式在調用業務函數時傳遞對上下文的引用(或更改跟蹤器)。

這樣的事情我應該暫時解決,因爲EF7最終將具有與EF6/NHibernate相同的功能?還是有沒有這種依賴關係的富域對象的方法?

回答

1

這可以通過使用依賴注入來解決。這將允許將您的域對象從您選擇的ORM中分離出來(以及依賴注入的所有其他優點)。關於如何將代碼中的問題分開,沒有任何單一的,絕對正確的答案。

相關說明:.Add()行爲將被改變EF7 - β8(見PR#2979)。當您爲父項調用.Add時,更改跟蹤器現在將包含所有「子」實體。

+0

Thanks @natemcmaster。我是依賴注入的忠實粉絲,但與域對象本身無關 - 只是因爲使用ORM時,通常很難控制持久存儲中對象的實現。 我看到他們提出了更改以支持向子對象的傳播,但是它是否適用於所有操作(添加,更新,刪除)似乎仍不清楚。 –

+0

@PhilDegenhardt更改將應用​​於添加/附加/更新。有關更多詳細信息,請參閱https://github.com/aspnet/EntityFramework/wiki/Design-Meeting-Notes-(August-27,2015)#addattach-for-graphs。刪除仍在審查中。 – natemcmaster

相關問題