域驱动设计:覆盖Domain类中的虚拟方法

时间:2013-06-08 08:03:02

标签: entity-framework domain-driven-design repository-pattern

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

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

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

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

我现在开始看到在我的Domain类中添加一些方法可能有意义的情况,例如Person

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

我想确保我不会破坏任何DDD约定。

我知道我也可以选择将这些方法放在存储库中 - 例如Person

2 个答案:

答案 0 :(得分:0)

Person.UpdateAddress肯定应该在您的域中,而不是在您的存储库中。 UpdateAddress是逻辑,您应该尝试避免存储库中的逻辑。如果您正在使用Entity框架,则不需要“数据类”。

答案 1 :(得分:0)

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

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