哪些对象应包含域驱动设计中的数据库访问方法

时间:2012-08-05 16:41:31

标签: domain-driven-design

我认为域驱动设计是说Get-methods在存储库中,Add / Del / Update在业务对象中?

你能澄清一下吗?

当我查看MVCMusicStore示例时,数据库中的所有CRUD方法都在实体中?!

http://mvcmusicstore.codeplex.com/SourceControl/changeset/view/d9f25c5263ed#MvcMusicStore%2fModels%2fShoppingCart.cs

3 个答案:

答案 0 :(得分:1)

我刚刚回答了一个类似的问题could domain models be aware of repositories?(以及Does "Save" method belong to the Business Domain Entity?) - 似乎许多DDD问题都是关于Active Record vs. Repository的选择。

我会关注Eric Evans的建议

  

一般情况下,不要打架你的框架。寻求方法来保持   DDD的基础知识,并在框架出现时详细说明   对立的。寻找DDD和DDD概念之间的亲和力   框架的概念。这假设您别无选择   但要使用框架。

因此,即使DDD的创建者意识到一些可能的不便,对我来说,Active Record和Repository之间的选择取决于当前的技术堆栈。

答案 1 :(得分:1)

您发布的链接不是域驱动设计的示例,它只是说明了MVC模式。如前所述,实体包含所有持久性逻辑,而业务逻辑主要位于控制器中。

在同一系统的域驱动设计中,实体包含任何持久性逻辑,但包含大部分业务逻辑。所有持久性函数都将驻留在存储库中,而控制器(a.k.a. services)将非常薄,并将大部分工作委托给实体。

答案 2 :(得分:0)

以下是典型的存储库:

public class OrderRepository {
    public MyClass Load(Guid id); // throws an exception if not found
    public void Save(Order order);
    public void Delete(Guid id); // does not throw an exception if not found (idempotent)
}