【问题标题】:Exceptions from Infrastructure to Presentation layers in DDDDDD 中从基础架构到表示层的异常
【发布时间】:2021-11-22 08:08:31
【问题描述】:

我有一个使用 Onion 架构的桌面应用程序,用户应该能够在其中创建和编辑磁盘上的本地文件。 我有以下几层:
Presentation->Application->Domain
Infrastructure->

我希望能够在处理文件时向用户展示问题,以便用户可以采取一些操作,例如选择是否覆盖已经存在的文件。但据我了解 DDD 应用程序层应该不了解基础设施层中的持久性细节。我的想法是异常(例如 FileExistsException)可能是应用程序层中接口契约的一部分,并从基础设施层的实现中抛出,但随后应用程序层会知道存储类型。

这也许可以,因为处理文件是应用程序范围的一部分?

我的问题主要是关于异常处理,但我发现还可以共享其他信息。

更新:

为了稍微扩展问题并更具体地说,用户使用保存为 JSON 文件的数据模型,因此我在域中拥有这些数据模型,并且文件的概念仅在实际持久化时用于基础设施层/更改文件。

如果将来我想给用户一个选项,将存储从本地磁盘更改为数据库,在那里他们将获得完全不同类型的异常来处理,是否也将必要的数据库特定信息添加到域名?

换句话说,如果用户有必要与之交互,即使它不一定是实际业务的一部分,是否可以将实现细节添加到域中?

在我看来,用户存储信息的方式是实现细节,应该远离域?

【问题讨论】:

    标签: domain-driven-design onion-architecture


    【解决方案1】:

    由于 File 是您域中的一个概念,因此 FileExistsException 应该在您的域中。 但实际的持久性机制应该在您的基础设施层中。

    您可以使用存储库来实现这一点:在域层中,您可以定义一个 FileRepository,它是与某些方法的接口,在基础架构中您可以定义实际的实现,例如 LocalDriveFileRepository。

    更新:

    如何持久化数据仅在基础架构层中很重要,因此您的应用程序层无法处理 FileExistsException 类型的异常,因为它不应该了解域和应用程序层之外的内容。

    您应该将基础架构异常重新映射为域异常。

    例如,可以将 FileExistsException 重新映射到 UserAlreadyPresentException 或其他在您的域中具有某些意义的异常。

    【讨论】:

    • 感谢您的回答 R4ncid。它使事情变得更加清晰,但提出了一些后续问题。我已将问题更新为更具体。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2021-11-22
    • 2011-04-19
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    相关资源
    最近更新 更多