“保存”方法是否属于业务域实体?

7

我没有使用任何ORM。所以,我正在辩论“Save”方法实际上是属于业务领域实体,还是应该在某些服务中进行抽象,这些服务将被交给业务领域实体进行保存?

例如:

class Employee
{
    string Name;
    DateTime Birth;

    GetAge()
    {

    }

    Save()
    {
    }           

}

或者

class Employee
{   
    string Name;
    DateTime Birth;

    GetAge()
    {

    }


}

SomePersistenceService
{
    Save(Employee emp)
        {
        }
}
2个回答

4
没有单一的最佳解决方案,你提出的问题是Repository和Active Record模式之间的选择。
通常,Repository更适合单元测试,因为Repository接口易于进行Mock操作,而且Repository模式使用高内聚和单一职责原则(从OOP的角度来看,你的业务实体将包含保存自己到数据库、通过网络传输自己或导出到某些XML等的代码,这可能看起来很奇怪)。
Active Record可能在快速应用程序开发中提供更快的速度,一些工具如Spring Roo最初只支持Active Record,Repository支持是最近才添加的。据我所知,Ruby On Rails使用Active Record,还有其他一些伟大的工具。
至于领域驱动设计,你应该像Jeroen建议的那样使用Repository,因为Repository是基本的DDD模式(它是DAO模式的面向领域的版本),但你应该检查你的工具是否直接支持这两种模式。

2

由于这个问题标记了“领域驱动设计”,您需要一个仓库来为您完成它。


只需将SomePersistenceService重命名为EmployeeRepository。所以您的第二个选项是正确的。在领域驱动设计中,“抽象化为将交给业务域实体的某些服务”被称为“仓库”。

仓库是一种假装您的数据存储是集合的方法。因此,它具有像AddRemove这样的方法,而不是SaveDelete


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接