首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD与EF代码第一-如何将它们放在一起?

DDD与EF代码第一-如何将它们放在一起?
EN

Stack Overflow用户
提问于 2012-11-04 12:47:23
回答 5查看 13.8K关注 0票数 19

我学习DDD发展了几天,我开始喜欢它。

我(认为我)理解DDD的原理,其中您的主要关注点是业务对象,其中您有聚合、聚合根、仅用于聚合根的存储库等等。

我试图创建一个简单的项目,在其中,我将DDD开发与代码优先方法结合起来。

我的问题是:(我正在使用asp.net MVC)

  1. DDD业务对象将与代码优先对象不同吗?即使它们可能是相同的,例如,我可以有一个包含所有规则和方法的Product业务对象,我也可以有一个Product代码优先(POCO)对象,它只包含我需要保存在数据库中的属性。
  2. 如果对问题1的回答是“真”,那么我如何通知Product POCO对象,业务对象Product中的一个属性已经更改,并且我必须更新它?我用的是"AutoMapper“之类的吗?如果答案是“不”,我就完全迷路了。

你能给我看一个最简单的(CRUD)例子,说明我如何把这两者结合起来吗?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-04 16:26:09

答案是否定的。EF代码最好的地方之一首先是它非常适合DDD,因为您必须手工创建业务对象,所以一定要使用EF模型来等效于DDD实体和值对象。不需要增加额外的复杂性,我不认为DDD建议在任何地方。

您甚至可以让您的实体实现IEntity,并且对对象进行赋值以实现IValue,此外,还可以遵循DDD模式的其余部分--即存储库--对数据库进行实际通信。更多这些想法--您可以在.NET中找到这个非常好的示例应用程序,即使它不首先使用EF代码,它仍然非常有价值:http://code.google.com/p/ndddsample/

票数 2
EN

Stack Overflow用户

发布于 2012-12-28 01:58:03

Update i不再提倡使用“域对象”,而是提倡使用基于消息传递的域模型。有关示例,请参见这里

第一条的答案是它取决于。在任何企业应用程序中,您都会在域中找到两大类内容:

直干

这里不需要域对象(),,因为对象的下一个状态不依赖于对象的前一个状态。都是数据而不是行为。在本例中,可以在任何地方使用相同的类(即EF ):编辑、持久化、显示。

这方面的一个例子是在订单上保存帐单地址:

代码语言:javascript
复制
public class BillingAddress {
  public Guid OrderId;
  public string StreetLine1;
  // etc.
}

另一方面我们有..。

状态机

您需要有单独的对象来处理域行为和状态持久化(以及工作所需的存储库)。域对象上的公共接口几乎都应该是空方法,而不应该是公共getter。这方面的一个例子是订单状态:

代码语言:javascript
复制
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); 
}

第二个问题的答案是,DbContext将自动跟踪对EF类的更改。

票数 7
EN

Stack Overflow用户

发布于 2012-11-04 21:51:51

最近我做了类似的项目。我遵循本教程:链接和我是这样做的:我创建了空白解决方案,添加了项目:域、服务和WebUI。

简单地说,在领域中,我已经把模型(例如,EF代码的类,方法等)服务用于域与世界(WebUI、MobileUI、其他站点等)的通信。使用asp.net webapi WebUi实际上是MVC应用程序(但模型在领域,所以主要是VC)。

希望我能帮上忙

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13218650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档