我没有使用任何ORM。所以我正在讨论“保存”方法是否实际上属于业务域实体,还是应该在某些服务中进行抽象,这些服务将通过业务域实体进行保存?
e.g。
class Employee
{
string Name;
DateTime Birth;
GetAge()
{
}
Save()
{
}
}
OR
class Employee
{
string Name;
DateTime Birth;
GetAge()
{
}
}
SomePersistenceService
{
Save(Employee emp)
{
}
}
答案 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。所以你选择第二个选项就在正确的轨道上。 “在某些服务中抽象,将通过业务域实体移交”在域驱动设计中称为存储库
存储库是一种假装您的数据存储区是集合的方法。所以它有Add
和Remove
等方法,而不是Save
和Delete
。