更新我不再提倡使用“域对象”,而是提倡使用基于消息传递的域模型。有关示例,请参见此处。
#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 类的更改。