![](/img/trans.png)
[英]EF code first: How to delete a row from an entity's Collection while following DDD?
[英]DDD with EF Code First - how to put them together?
我正在學習DDD開發幾天,我開始喜歡它了。
我(我想)了解DDD的原理,其中您主要關注業務對象,其中您有聚合,聚合根,僅用於聚合根的存儲庫等等。
我正在嘗試創建一個簡單的項目,我將DDD開發與Code First方法結合起來。
我的問題是:(我使用的是asp.net MVC)
DDD Business Objects將與Code First對象不同? 即使它們可能是相同的,例如我可以擁有一個具有所有規則和方法的Product
業務對象,並且我可以擁有一個Product
code first(POCO)對象,它只包含我需要保存在數據庫中的屬性。
如果問題1的答案是“真”,那么我如何通知Product
POCO對象業務對象Product
的屬性已被更改,我必須更新它? 我正在使用“AutoMapper”或類似的東西? 如果答案是“不”,我就完全迷失了。
你能告訴我一個最簡單的(CRUD)例子,我怎么能把這兩個放在一起?
謝謝
更新我不再提倡使用“域對象”,而是主張使用基於消息傳遞的域模型。 請看這里的例子。
#1的答案取決於它 。 在任何企業應用程序中,您將在域中找到2個主要類別的東西:
直CRUD
這里不需要域對象,因為對象的下一個狀態不依賴於對象的先前狀態。 這是所有數據,沒有行為。 在這種情況下,可以在任何地方使用相同的類(即EF POCO):編輯,持久化,顯示。
例如,在訂單上保存帳單郵寄地址:
public class BillingAddress {
public Guid OrderId;
public string StreetLine1;
// etc.
}
另一方面,我們......
國家機器
您需要為域行為和狀態持久性 (以及執行工作的存儲庫)提供單獨的對象 。 域對象上的公共接口應該幾乎總是所有void方法,而不是公共getter。 這方面的一個例子是訂單狀態:
public class Order { // this is the domain object
private Guid _id;
private Status _status;
// note the behavior here - we throw an exception if it's not a valid state transition
public void Cancel() {
if (_status == Status.Shipped)
throw new InvalidOperationException("Can't cancel order after shipping.")
_status = Status.Cancelled;
}
// etc...
}
public class Data.Order { // this is the persistence (EF) class
public Guid Id;
public Status Status;
}
public interface IOrderRepository {
// The implementation of this will:
// 1. Load the EF class if it exists or new it up with the ID if it doesn't
// 2. Map the domain class to the EF class
// 3. Save the EF class to the DbContext.
void Save(Order order);
}
#2的答案是DbContext將自動跟蹤EF類的更改。
答案是否定的。首先,EF代碼最好的一點就是它非常適合DDD,因為你必須手動創建業務對象,所以要使用你的EF模型等同於DDD實體和值對象。 無需添加額外的復雜層,我不認為DDD會在任何地方推薦。
您甚至可以讓您的實體實現IEntity,並且您重視對象以實現IValue,另外還要遵循其余的DDD模式,即Repositories來與數據庫進行實際通信。 更多這些想法你可以在.NET中找到這個非常好的示例應用程序,即使它不首先使用EF代碼,它仍然非常有價值: http : //code.google.com/p/ndddsample/
最近我做了類似的項目。 我正在學習本教程: 鏈接我已經這樣做了:我創建了Blank解決方案,添加了項目:Domain,Service和WebUI。
簡單地說在域中我已經把模型(例如EF代碼的類首先,方法等)服務用於域與世界(WebUI,MobileUI,其他站點等)使用asp.net webapi進行通信WebUi實際上是MVC應用程序(但模型在域中,因此它主要是VC)
希望我幫了
Pluralsight課程: 企業中的實體框架進入了與EF Code First結合的域驅動設計的確切場景。
對於1號,我相信你可以這樣做。 這只是一種風格問題。 對於2號,視頻中的講師會通過幾種方式來解釋這一點。 一種方法是在修改值時在客戶端設置的每個類上都有一個“State”屬性。 然后DbContext知道要保留的更改。
關於這個主題的晚期問題。 閱讀Josh Kodroff的回答證實了我對Repository實現的想法,例如Entity Framework DAL。
您將域對象映射到EF persistance對象,並讓EF在保存時處理它。 檢索時,讓EF從數據庫中提取並將其映射到域對象(聚合根)並將其添加到您的集合中。
這是存儲庫實現的正確策略嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.