簡體   English   中英

使用EF Code First的DDD - 如何將它們組合在一起?

[英]DDD with EF Code First - how to put them together?

我正在學習DDD開發幾天,我開始喜歡它了。

我(我想)了解DDD的原理,其中您主要關注業務對象,其中您有聚合,聚合根,僅用於聚合根的存儲庫等等。

我正在嘗試創建一個簡單的項目,我將DDD開發與Code First方法結合起來。

我的問題是:(我使用的是asp.net MVC)

  1. DDD Business Objects將與Code First對象不同? 即使它們可能是相同的,例如我可以擁有一個具有所有規則和方法的Product業務對象,並且我可以擁有一個Product code first(POCO)對象,它只包含我需要保存在數據庫中的屬性。

  2. 如果問題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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM