【发布时间】:2012-10-03 19:06:53
【问题描述】:
a) 域实体不应该包含与持久性相关的代码,因此它们应该是Persistence Ignorant PI。但假设 Domain Model DM 是使用 Entity Framework 设计的,并假设 service layer 为 执行 CRUD 操作POCO 域实体 通过 Linq-to-Entities,我们认为 服务层 是直接访问 DAL 还是通过 Domain型号:
class CustomerService
{
public string doSomething( ... )
{
...
var customer = context.Customers.Where( ... );
...
}
...
}
b) 在 DM 中使用 Linq-to-Entities 是否违反 PI 规则?例如,以下Customer 实体是否违反 PI:
class Customer
{
public string InterestedWhatOtherCustomerOrdered( ... )
{
...
var orders = context.Orders.Where( ... ); // does this violate PI rule?
...
}
...
}
回复卢克·麦格雷戈:
一)
是的,因为它直接引用上下文。更好的方法是 是使用 Customer 上的内部导航属性来执行 同样的动作,
所以导航属性应该联系上下文?!但是由于 导航属性 也存在于域模型中,那么我们难道不能说通过直接联系 上下文,它们也会违反 PI 吗?
b) 根据Fowler 的关于Data Mapper 的PEAA 章节,可以从Data Mapper 中提取领域代码所需的任何方法到接口类中,哪个领域代码然后可以使用。当使用 EF 而不是手写的Data Mapper 时,究竟如何做到这一点,这样我们就不会违反 PI?
谢谢
【问题讨论】:
标签: entity-framework design-patterns orm domain-driven-design