我的应用程序分为几个程序集。
MyProject.Infrastructure 程序集包含所有域对象,例如Person
和Sale
以及接口存储库,例如IPersonRepository
和{{1 }}
MyProject.Data 程序集包含这些存储库的具体实现。
存储库从数据库中提取数据并实例化新的域类。例如,ISaleRepository
将从数据源读取客户,创建一个新的IPersonRepository.GetPersonByNumber(customerNumber)
类,填充它并返回给调用者。
我现在开始看到在我的Domain类中添加一些方法可能有意义的情况,例如Person
。
将此方法作为虚方法放在我的Person.UpdateAddress(address)
类上是否可以,然后在我的数据层中创建派生类,它们会覆盖这些方法以提供所需的功能?
我想确保我不会破坏任何DDD约定。
我知道我也可以选择将这些方法放在存储库中 - 例如Person
。
答案 0 :(得分:0)
Person.UpdateAddress肯定应该在您的域中,而不是在您的存储库中。 UpdateAddress是逻辑,您应该尝试避免存储库中的逻辑。如果您正在使用Entity框架,则不需要“数据类”。
答案 1 :(得分:0)
大多数ORM都有更改跟踪器,当您持久保存主实体时会自动保留相关实体(前提是您在映射配置中声明了正确的关系),因此您的存储库中不需要UpdatePersonAddress()
。只需在Person.UpdateAddress(address)
中的对象级别执行任何操作,而不考虑持久性,这不是那个地方。
您需要的是一个对象,它将在执行上下文感知代码中调用,以便在您认为是时候保存这些更改时刷新对持久性存储的更改。例如,它可能是一个包含Entity Framework DbContext的工作单元。