a) 域实体不应包含与持久性相关的代码,因此它们应该是Persistence Ignorant PI。但是假设域模型 DM是使用实体框架设计的,并假设服务层 通过Linq-to-Entities对POCO 域实体执行 CRUD 操作,我们是否会认为服务层直接或通过域模型访问 DAL :
class CustomerService
{
public string doSomething( ... )
{
...
var customer = context.Customers.Where( ... );
...
}
...
}
b)在DM中使用Linq-to-Entities是否违反PI 规则?例如,以下实体是否违反 PI:Customer
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的方式准确地做到这一点?
谢谢你