Domain driven design 是不是;“保存”;方法是否属于业务域实体?

Domain driven design 是不是;“保存”;方法是否属于业务域实体?,domain-driven-design,entity,3-tier,business-logic-layer,Domain Driven Design,Entity,3 Tier,Business Logic Layer,我没有使用任何ORM。因此,我正在讨论“Save”方法是否实际上属于业务域实体,还是应该在将移交给业务域实体进行保存的某个服务中进行抽象 e、 g class员工 { 字符串名; 出生日期; GetAge() { } 保存() { } } 或 class员工 { 字符串名; 出生日期; GetAge() { } } SomePersistenceService { 保存(员工emp) { } } 因为这个问题被标记为“域驱动设计”,所以您需要一个存储库来为您解决这个

我没有使用任何ORM。因此,我正在讨论“Save”方法是否实际上属于业务域实体,还是应该在将移交给业务域实体进行保存的某个服务中进行抽象

e、 g

class员工
{
字符串名;
出生日期;
GetAge()
{
}
保存()
{
}           
}

class员工
{   
字符串名;
出生日期;
GetAge()
{
}
}
SomePersistenceService
{
保存(员工emp)
{
}
}

因为这个问题被标记为“域驱动设计”,所以您需要一个存储库来为您解决这个问题


只需将某个PersistenceService重命名为EmployeeRepository。所以你的第二个选择是正确的。在域驱动设计中,“抽象在将移交给业务域实体的某些服务中”称为存储库


存储库是一种假装数据存储是一个集合的方式。因此,它有类似于
Add
Remove
的方法,而不是
Save
Delete
没有单一的最佳解决方案,您提到的问题是在存储库模式和活动记录模式之间进行选择

通常,存储库更适合于单元测试,因为存储库接口易于模拟,而且存储库模式使用高内聚性和单一责任原则(从OOP的角度来看,您的业务实体将包含用于将自身保存到数据库、通过网络传输自身或导出到某些XML等的代码,这似乎有些奇怪。)

Active Record可能会在RAD开发中提供更高的速度,一些工具(如Spring Roo)最初设计时只支持Active Record,据我所知,最近才添加了存储库支持


至于域驱动的设计,您应该按照Jeroen的建议使用Repository,因为Repository是一个基本的DDD模式(它是DAO模式的一个以域为中心的版本),但是您应该检查您的工具是否直接支持这两种模式。

@@Jeroen,如果您能通过修改我的示例来展示一个示例,我将不胜感激。