2015-09-10 23 views
5

我工作在公开REST API的后端应用程序上,并尝试在我的项目中使用域驱动设计。API基础结构类应该是DDD中域的一部分吗?

REST API对一组固定的域类进行操作。对于来自域的每个Agregate根,都有一个单独的REST端点。然而,尽管所有的努力,也有情况下,当新类,而不是从域类(基础设施类)派生出来,如:

  • 批量操作[{"id": 1, "status": "success"},{"id": 2, "status": "failure", "message": "detailed message"}]
  • 一类列一类控股状态由用户选择[{"column": "id", "order": 1}, {"column":"created", "order": 2 }]

现在两个选项:

  • 是否确定有REST API暴露是不是一部分的类域名?
  • 或者这些类应该成为域的一部分?
+1

我认为完全可以公开特定于图层的合同。例如,DTO通常在应用程序层中定义... – plalx

回答

5

您不应该尝试直接针对您的域模型构建REST API。您需要承担相当多的责任,因为这样的界面会混淆您的域模型。例如。事务控制,安全性,输入验证是您可能需要的东西,但不属于域模型。

这是应用程序服务的用途。

建立层围绕你的域模型包含应用程序服务(通常称为服务层)。应用程序服务是域模型的直接客户端。它们通常组织在用例而不是聚合。现在,您的REST API是应用程序服务的直接客户端,而不是域模型。

您提到的两个类然后也很适合服务层。

编辑:

注意,使用六角架构(这是一个非常适合DDD)时,服务层是不一样的持久层。服务层使用持久层加载并将聚合保存到数据库。

+0

应用程序层基础结构是不可知的吗?所以REST框架是应用程序层的第一个客户端? – danfromisrael

+0

@danfromisrael看到我更新的答案 – theDmi

+0

感谢@theDmi的答案。我完全同意你所描述的方法,但我有一个问题。假设我们有一个GET方法返回对象列表,每个对象都有一个状态列。现在我们需要创建一个新的GET方法,它将返回一个唯一状态列表以及具有此状态的元素数量。为此,我们创建一个具有两个属性的新DTO类:“字符串状态”和“长计数”。在哪一层应该定义这个类?应用程序,对吗?基于DDD的存储库是否应该返回应用程序层类的实例? –

相关问题