6

我正在尝试习惯六边形架构,但不知道如何实现常见的实际问题,这些问题已经通过不同的方法实现。我认为我的核心问题是了解提取到适配器和端口的责任级别。

阅读网络上的文章可以使用以下原始示例:

我们有可以在 mysql/txt/s3/nosql 存储中实现的 RepositoryInterface

或者

我们有 NotificationSendingInterface 并有 email/sms/web 推送实现

但这些都是非常精炼的例子,只是接口/实现细节的分离。

然而在实践中,域模型中的编码服务我们通常更深入地了解接口+实现保证。

出于说明目的示例,我决定询问存储+事务对。

存储的事务概念应该如何在十六进制架构中实现?假设我们在域级别有简单的 crud 服务接口

StorageRepoInterface
   save(...)
   update(...)
   delete(...)
   get(...)

我们在使用这些方法时需要某种事务保证,例如在一个事务中删除+保存。

它应该如何根据十六进制概念设计和实现?

是否应该使用TransactionalOperation的一些外部协调接口来实现?如果是,那么一般来说,TransactionalOperation必须知道如何实现与StorageRepoInterface的所有实现一起使用的事务保证(mb 在额外的面向事务的操作接口中)

如果不是,那么似乎应该在域级别(十六进制内部)的StorageRepoInterface中使用其他方法提供明确的事务保证?

无论哪种方式,它都不像所述的那样“基于隔离和接口”。

有人可以指出我如何在这种情况下正确改变思维方式或在哪里阅读?

提前致谢。

4

1 回答 1

4

在 Hex Arch 中,驱动程序端口是应用程序的 API,即用例边界。用例是事务性的。因此,您必须控制驱动程序端口方法的事务性。您将每个方法都包含在事务中。

如果您使用 Spring,则可以使用声明性事务(@Transactional 注释)。

另一种方法是在方法执行之前显式打开一个数据库事务,并在方法之后关闭(提交/回滚)它。

应用事务性的一个有用模式是命令总线,用装饰器包装它,将命令包含在事务中。

事务是基础设施,因此您应该有一个驱动端口和一个实现该端口的适配器。

实现必须使用持久性适配器(存储库)使用的相同数据库上下文(实体管理器)。

Vaughn Vernon 在他的书“实施 DDD”的“管理事务”部分(第 432-437 页)谈到了这个话题。

于 2020-05-23T18:17:51.520 回答