0

我的应用程序分为几个程序集。

MyProject.Infrastructure程序集包含所有域对象,例如PersonSale以及接口存储库,例如IPersonRepositoryISaleRepository

MyProject.Data程序集包含这些存储库的具体实现。

存储库从数据库中提取数据并实例化新的域类。例如,IPersonRepository.GetPersonByNumber(customerNumber)将从数据源中读取一个客户,创建一个新Person类,填充它并返回给调用者。

我现在开始看到向我的域类添加一些方法可能有意义的情况,例如Person.UpdateAddress(address).

是否可以将此方法Person作为虚拟方法放在我的类上,然后在我的数据层中创建派生类来覆盖这些方法以提供所需的功能?

我想确保我不会违反任何 DDD 约定。

我知道我也可以选择将这些方法放在存储库中 - 例如IPersonRepository.UpdatePersonAddress(person, address)

4

2 回答 2

0

Person.UpdateAddress 绝对应该在您的域中,而不是在您的存储库中。UpdateAddress 是逻辑,您应该尽量避免存储库中的逻辑。如果您正在使用实体框架,则不需要“数据类”。

于 2013-06-09T13:28:03.647 回答
0

大多数 ORM 都有更改跟踪器,当您保留主要实体时,它们会自动保留相关实体(前提是您在映射配置中声明了正确的关系),因此您不需要UpdatePersonAddress()存储库。只需在对象级别做任何你想做的事情,Person.UpdateAddress(address)而不考虑持久性,这不是那个地方。

但是,您需要的是一个对象,当您认为是时候保存这些更改时,该对象将在执行上下文感知代码中调用以将更改刷新到持久存储。例如,它可能是一个包含实体框架 DbContext 的工作单元。

于 2013-06-13T08:04:20.950 回答