【问题标题】:DDD: Should the application service be placed in backend or the UIDDD:应用服务应该放在后端还是UI
【发布时间】:2021-03-17 07:19:32
【问题描述】:

一些 DDD 书籍状态,如 [1] 状态,虽然我们有一个领域模型,但我们可以有多个应用程序服务层(有些使用术语服务层)。这是因为应用程序层是应用程序的特定 UI 与域模型和基础设施层之间的接口,因此如果我们有多个与后端一起工作的用户界面,则可能存在多个应用程序服务层。这一点向我提出了应用层在哪里定位的问题。
我正在使用 .NET C# 创建一个应用程序。整个应用程序在一个解决方案中,其中 UI(我们有三个将使用后端的不同 winform 应用程序)是单独的项目,而后端项目(包含域层和基础设施层的类库)是一个单独的项目:

-- My Solution 
    |
    +-- Application.UI Number 1
    +-- Application.UI Number 2
    +-- Application.UI Number 3
    +-- Application.Backend
             |
             +-- Domain Layer (Model and Domain Services)
             +-- Infrastructure Layer (Repositories with ORM-Tool)

在示例中,我目前看到的应用程序服务层是放在Application.Backend 中的。但是,基于我们可以为每个 UI 拥有不同的应用程序服务层这一事实,这是正确的吗?您将项目Application.ApplicationLayer1Application.ApplicationLayer2Application.ApplicationLayer3 放在哪里?还是将所有应用层合并为一个应用服务层?

埃斯波西托等人。 [1]状态:

表示层和应用层是前端的一部分 系统;

他们在其中一个示例中的Application.UI 项目中添加了应用程序层。 其他书籍如[2] 在后端而不是前端有一个独特的应用层。
在 UI 中插入应用程序服务层让我很恼火。原因是应用服务层包含了应用的所有业务用例。它是领域模型和基础设施层的客户端。这意味着通过将应用程序层放在 UI 中,每个 UI 都会有自己的应用程序层。但是 UI-1 中使用的一些用例很有可能也在 UI-2 中使用。因此,您将有代码重复。

哪个是正确的?

【问题讨论】:

    标签: c# domain-driven-design service-layer


    【解决方案1】:

    我确实将应用程序层视为域的唯一入口点。应用程序服务和/或事件处理程序可能存在于该层中。在考虑洋葱架构的情况下可视化各层,应用程序层包装了域层。

    很好,你挑战了它,但我认为你已经自己回答了。应用层应该是后端的一部分。

    不过,我不会将服务与 UI 进行一对一的映射。我会按功能或资源将它们分开。如果不会产生大量开销,那么使用命令和视图驱动的应用程序服务进行额外的写入/读取分离可能也会很好。如果您的 UI 需要相同的数据,但需要经过转换或丰富,您可能希望在中间的额外“转换”层中解决它,或者通过更灵活的查询接口(例如 GraphQL)来获取它们

    这是我的看法。

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2023-04-07
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多