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

时间:2012-07-23 13:40:38

标签: domain-driven-design entity 3-tier business-logic-layer

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

e.g。

class Employee
{
    string Name;
    DateTime Birth;

    GetAge()
    {

    }

    Save()
    {
    }           

}

OR

class Employee
{   
    string Name;
    DateTime Birth;

    GetAge()
    {

    }


}

SomePersistenceService
{
    Save(Employee emp)
        {
        }
}

2 个答案:

答案 0 :(得分:3)

没有单一的最佳解决方案,您所说的问题是存储库和活动记录模式之间的选择。

通常,Repository更适合单元测试,因为Repository接口易于模拟,Repository模式也使用High Cohesion和Single Responsibility原则(从OOP的角度来看,您的业务实体将包含用于保存的代码,这看起来很奇怪本身到数据库,通过网络传输自己,或导出到某些XML等。)

Active Record可以提供更多的RAD开发速度,而一些像Spring Roo这样的工具最初只是设计支持Active Record,据我所知,最近才添加了Repository支持。 AFAIK Ruby On Rails也使用Active记录和其他一些很棒的工具。

对于域驱动设计,你应该使用Repository作为Jeroen建议,因为Repository是一个基本的DDD模式(它是DAO模式的以域为中心的版本),但你应该检查你的工具是否有任何模式的直接支持。

答案 1 :(得分:2)

由于此问题标记为“域驱动设计”,因此您需要一个存储库来为您执行此操作。


将SomePersistenceService重命名为EmployeeRepository。所以你选择第二个选项就在正确的轨道上。 “在某些服务中抽象,将通过业务域实体移交”在域驱动设计中称为存储库

存储库是一种假装您的数据存储区是集合的方法。所以它有AddRemove等方法,而不是SaveDelete