我学习DDD发展了几天,我开始喜欢它。
我(认为我)理解DDD的原理,其中您的主要关注点是业务对象,其中您有聚合、聚合根、仅用于聚合根的存储库等等。
我试图创建一个简单的项目,在其中,我将DDD开发与代码优先方法结合起来。
我的问题是:(我正在使用asp.net MVC)
Product业务对象,我也可以有一个Product代码优先(POCO)对象,它只包含我需要保存在数据库中的属性。Product POCO对象,业务对象Product中的一个属性已经更改,并且我必须更新它?我用的是"AutoMapper“之类的吗?如果答案是“不”,我就完全迷路了。你能给我看一个最简单的(CRUD)例子,说明我如何把这两者结合起来吗?
谢谢
发布于 2012-11-04 16:26:09
答案是否定的。EF代码最好的地方之一首先是它非常适合DDD,因为您必须手工创建业务对象,所以一定要使用EF模型来等效于DDD实体和值对象。不需要增加额外的复杂性,我不认为DDD建议在任何地方。
您甚至可以让您的实体实现IEntity,并且对对象进行赋值以实现IValue,此外,还可以遵循DDD模式的其余部分--即存储库--对数据库进行实际通信。更多这些想法--您可以在.NET中找到这个非常好的示例应用程序,即使它不首先使用EF代码,它仍然非常有价值:http://code.google.com/p/ndddsample/
发布于 2012-12-28 01:58:03
Update i不再提倡使用“域对象”,而是提倡使用基于消息传递的域模型。有关示例,请参见这里。
第一条的答案是它取决于。在任何企业应用程序中,您都会在域中找到两大类内容:
直干
这里不需要域对象(),,因为对象的下一个状态不依赖于对象的前一个状态。都是数据而不是行为。在本例中,可以在任何地方使用相同的类(即EF ):编辑、持久化、显示。
这方面的一个例子是在订单上保存帐单地址:
public class BillingAddress {
public Guid OrderId;
public string StreetLine1;
// etc.
}另一方面我们有..。
状态机
您需要有单独的对象来处理域行为和状态持久化(以及工作所需的存储库)。域对象上的公共接口几乎都应该是空方法,而不应该是公共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);
}第二个问题的答案是,DbContext将自动跟踪对EF类的更改。
发布于 2012-11-04 21:51:51
最近我做了类似的项目。我遵循本教程:链接和我是这样做的:我创建了空白解决方案,添加了项目:域、服务和WebUI。
简单地说,在领域中,我已经把模型(例如,EF代码的类,方法等)服务用于域与世界(WebUI、MobileUI、其他站点等)的通信。使用asp.net webapi WebUi实际上是MVC应用程序(但模型在领域,所以主要是VC)。
希望我能帮上忙
https://stackoverflow.com/questions/13218650
复制相似问题