6

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

例如

class Employee
{
    string Name;
    DateTime Birth;

    GetAge()
    {

    }

    Save()
    {
    }           

}

或者

class Employee
{   
    string Name;
    DateTime Birth;

    GetAge()
    {

    }


}

SomePersistenceService
{
    Save(Employee emp)
        {
        }
}
4

2 回答 2

4

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

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

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

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

于 2012-07-24T12:12:10.187 回答
2

由于这个问题被标记为“领域驱动设计”,因此您需要一个存储库来为您做这件事。


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

存储库是一种假装您的数据存储是一个集合的方法。所以它有类似AddandRemove而不是Saveand的方法Delete

于 2012-07-23T15:11:43.650 回答