DDD 中从基础架构到表示层的异常
Exceptions from Infrastructure to Presentation layers in DDD
我有一个使用洋葱架构的桌面应用程序,用户应该能够在磁盘上创建和编辑本地文件。
我有以下图层:
演示文稿->应用程序->域
基础结构->
我希望能够在处理文件时向用户展示问题,以便用户可以采取一些操作,例如选择是否覆盖已存在的文件。但据我了解 DDD,应用层不应该了解基础设施层中的持久性细节。我的想法是,异常(例如 FileExistsException)可能是应用层中接口契约的一部分,并从基础设施层的实现中抛出,但应用层会知道存储类型。
这可能没问题吗,因为处理文件是应用程序范围的一部分?
我的问题主要是关于异常处理,但我发现也可以共享其他信息。
更新:
为了稍微扩展问题并更具体地说,用户使用保存为 JSON 文件的数据模型,所以我在域中有这些数据模型,文件的概念仅用于实际上 persisting/changing 文件时的基础结构层。
如果将来我想让用户选择将存储从本地磁盘更改为数据库,在数据库中他们将得到完全不同类型的异常来处理,必要的数据库特定信息是否也会是添加到域中?
换句话说,如果用户需要与之交互,即使它不一定是实际业务的一部分,是否可以将实现细节添加到域中?
在我看来,用户存储信息的方式是实现细节,应该远离域?
由于文件是您域中的一个概念,因此 FileExistsException 应该在您的域中。
但是真正的持久化机制应该在你的基础设施层。
您可以使用存储库实现这一点:在域层中,您可以定义一个 FileRepository,它是具有某种方法的接口,在基础结构中,您可以定义实际的实现,例如 LocalDriveFileRepository。
更新:
如何持久保存数据仅在基础设施层很重要,因此您的应用层无法处理 FileExistsException 类型的异常,因为它不应该了解域和应用层之外的内容。
您应该将基础架构例外重新映射到域例外。
例如,FileExistsException 可以重新映射到 UserAlreadyPresentException 或在您的域中具有某种意义的其他一些异常。
我有一个使用洋葱架构的桌面应用程序,用户应该能够在磁盘上创建和编辑本地文件。
我有以下图层:
演示文稿->应用程序->域
基础结构->
我希望能够在处理文件时向用户展示问题,以便用户可以采取一些操作,例如选择是否覆盖已存在的文件。但据我了解 DDD,应用层不应该了解基础设施层中的持久性细节。我的想法是,异常(例如 FileExistsException)可能是应用层中接口契约的一部分,并从基础设施层的实现中抛出,但应用层会知道存储类型。
这可能没问题吗,因为处理文件是应用程序范围的一部分?
我的问题主要是关于异常处理,但我发现也可以共享其他信息。
更新:
为了稍微扩展问题并更具体地说,用户使用保存为 JSON 文件的数据模型,所以我在域中有这些数据模型,文件的概念仅用于实际上 persisting/changing 文件时的基础结构层。
如果将来我想让用户选择将存储从本地磁盘更改为数据库,在数据库中他们将得到完全不同类型的异常来处理,必要的数据库特定信息是否也会是添加到域中?
换句话说,如果用户需要与之交互,即使它不一定是实际业务的一部分,是否可以将实现细节添加到域中?
在我看来,用户存储信息的方式是实现细节,应该远离域?
由于文件是您域中的一个概念,因此 FileExistsException 应该在您的域中。 但是真正的持久化机制应该在你的基础设施层。
您可以使用存储库实现这一点:在域层中,您可以定义一个 FileRepository,它是具有某种方法的接口,在基础结构中,您可以定义实际的实现,例如 LocalDriveFileRepository。
更新:
如何持久保存数据仅在基础设施层很重要,因此您的应用层无法处理 FileExistsException 类型的异常,因为它不应该了解域和应用层之外的内容。
您应该将基础架构例外重新映射到域例外。
例如,FileExistsException 可以重新映射到 UserAlreadyPresentException 或在您的域中具有某种意义的其他一些异常。