问题标签 [hexagonal-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
823 浏览

java - DDD - java 9 模块项目组织

我正在尝试使用 java 9 中的六边形架构(使用 maven 模块)来组织 DDD 项目。是否有任何工作示例已经在生产系统中使用?所以,到目前为止,我只知道如何做到这一点:

在这里,我的domain模块包含所有命令、事件、域模型(带有聚合、实体和值对象)以及存储库接口 + 域服务接口(如果在基础设施上中继)和实现。其他application模块包含应用程序服务,其中我有应用程序的“用例”(协调加载聚合等的简单方法)。

那么这些十六进制架构的适配器呢?每个适配器是否应该在模块中分开(例如mysql-adapter,我可以在哪里实现依赖于基础设施的存储库?另外,为rabbitmq聚合有单独的模块?

任何关于这方面的例子都会很棒!

在此处输入图像描述

0 投票
1 回答
330 浏览

api-platform.com - 带有 api 平台的六边形架构

我将使用api-platform创建一个 api,并且我想将我的业务逻辑与框架分开。

例如,我想允许用户注册新帐户,POST: /user这很好。Api 平台正在做所有的事情(处理请求、验证数据、保存新用户(原则)、返回响应)。但是我的业务逻辑想在创建新用户期间发送邀请电子邮件并进行其他操作。我应该如何做到这一点才能使用 api-platform?

我应该创建自定义操作POST: /register,内部调用我的用例register($user)吗?我应该创建自定义存储库接口和内部save(User)实现调用POST: /user吗?

或者我应该使用事件系统并将我的“大”用例 () 拆分register为小用例,这取决于我的业务逻辑需要做什么(验证数据、发送邀请电子邮件等)?如果我想从 CLI 注册新用户,我的命令必须使用所有这些小用例吗?

还是我应该完全忘记所有 api 平台的魔法,如果我的业务逻辑比 CRUD 更多,我必须自己处理所有事情(验证数据、保存到数据库、发送电子邮件等)?

0 投票
1 回答
1508 浏览

interface - 六边形体系结构和交易概念

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

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

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

或者

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

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

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

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

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

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

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

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

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

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

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

提前致谢。

0 投票
1 回答
94 浏览

mysql - 六边形架构的 MySQL(加上 Redis)实现上的单个查询或 JOIN

我正在开发一个具有六边形架构的 NodeJS 项目,但我对如何在数据库(MySQL 和 Redis)的实现中管理工作流有很大的疑问

MySQL实现:

  • 我正在使用Sequelize ORM并且可以填充模型以获取关联(JOINs)。Sequelize 实现让我可以在一个模型中设置一些选项,以便将其他模型直接包含在它自己的存储库中。我不需要依赖第二个模型。

Redis 实现:

  • 但是,使用 Redis,我需要单独查询所有资源。这个是正常的。无法关联模型,我必须转到第二个模型的存储库。这些操作应该在我假设的用例中完成。

例子:

MySQL实现顺序

1.1。GetContentsWithVideosUseCase -> 我创建了一个标准来获取所有内容加入它自己的视频

1.2. ContentRepository.findAll(criteriaForJoinVideos) -> 这里我已经有了每个内容及其视频。

1.3. GetContentsWithVideosUseCase -> 我不再需要,所以将它返回给控制器。

Redis 实现顺序

2.1。GetContentsWithVideosUseCase -> 我创建了一个获取所有内容的标准。

2.2. ContentRepository.findAll(criteriaContents) -> 这里我只有每个内容。

2.3. GetContentsWithVideosUseCase -> 我有内容,但现在我需要其中的视频。Contents.map 并按内容为每个视频查询创建标准。

2.4. VideoRepository.findAll(criteriaVideosByContent) -> 这里我已经有一个内容的视频。

2.5. GetContentsWithVideosUseCase -> 我现在拥有所有内容的所有视频,并且我编写了将返回的对象。

问题!

我们可以看到这里的问题是用例应该与实现不同并且不应该发生。

这种情况下的问题是什么是最佳和最正确的做法:

  • 我是否应该独立执行所有 MySQL 查询(在各自的存储库中分隔它们)并留下 JOIN?
  • 是否可以通过 Redis 实现保留 JOIN?
  • 你有没有处理过这个问题?

谢谢!

0 投票
3 回答
2217 浏览

python - 工厂方法与 Python 中的注入框架 - 什么更干净?

我通常在我的应用程序中做的是使用工厂方法创建我所有的服务/dao/repo/clients

当我创建应用程序时,我会

是什么创建了所有依赖项

在测试中,当我不想使用真正的数据库时,我只做 DI

我想这与干净/十六进制架构相去甚远,因为服务知道如何创建数据库并知道它创建的数据库类型(也可能是 InMemoryDatabse 或 MongoDatabase)

我想在干净/十六进制架构中我会有

我会建立注入器框架来做

我的问题是:

  • 我的方式真的很糟糕吗?它不再是一个干净的架构了吗?
  • 使用注入有什么好处?
  • 是否值得打扰和使用注入框架?
  • 还有其他更好的方法可以将域与外部分开吗?
0 投票
2 回答
399 浏览

domain-driven-design - 六边形架构在控制器或服务中聚合

我有一个六边形架构的服务,负责在系统中创建潜在客户。在此服务中,我没有用户,我必须调用外部服务。

在我通过 API 收到的潜在客户创建请求中,我没有 user_id(创建者),我有用户电子邮件。

我的问题是,我应该在哪里打这个电话?

a) 在控制器中调用外部服务来获取用户,并将其传递给负责创建线索的应用程序服务。在这种情况下,我是否应该再次调用外部服务来检查给定的 ID 是否存在?

b) 在控制器中,传递电子邮件,并在应用服务中使用用户电子邮件调用外部服务,以获取用户。

我更喜欢第一个,因为我不会用我在 API 中收到的内容来损害应用程序服务。

你怎么看?

0 投票
2 回答
268 浏览

java - Hexagonal 中的 InboundPorts 如何提高可测试性

在端口和适配器(六边形)架构中,您有:

注意:当然端口是域的一部分

一个具体的例子可能是:

因此,端口和适配器架构背后的想法是,您可以将域与应用程序边缘的具体适配器分开测试。

我不明白左侧的接口端口对可测试性有何用处?

WebController 没有重要的逻辑,因此本身不会成为测试目标,并将作为端到端测试的一部分进行测试。所以我不会模拟 OrderServicePort,因为它通常是我的测试对象。

当然,InboundPorts 的价值在于它们只公开了实现它的具体域类的简化视图。

但是我看不出使用 InboundPorts 增加的可测试性从何而来。

同意?

0 投票
1 回答
254 浏览

java - 复杂的多模块maven项目构建失败

我坚持基于 Hexagonal 架构构建复杂的 Maven 多模块项目。

我的 Maven 模块结构看起来像这样

root.xml 看起来像这样

这是基础设施适配器.xml

问题是在构建持久性适配器期间看不到域模块中的类,这是spring data jpa持久性适配器中的pom

错误是

有谁知道可能是什么问题,内部模块可以依赖于外部模块,或者构建顺序可能不好?

0 投票
2 回答
182 浏览

hibernate - Spring Data - 不同包中的 hibernate.cfg.xml

我是 Spring 新手,正在尝试使用 Spring 数据创建六边形架构

我有一个 gradle 多模块设置,其中包含域的包,一个用于持久性,另一个用于配置,DddApplication 所在的位置。

启动它时,我得到Not a managed type: class com.example.ddd.domain.model.Customer,除非我用 javax.persistence.@Entity 等注释类。

但是我不想在课堂上添加注释。persistence我已经在包中的 hibernate.cfg.xml 和 Customer.hbm.xml 中设置了实体。

我认为 spring boot 没有使用其他包中的 hibernate.cfg.xml 。

有什么方法可以配置 Spring Boot 以根据persistence包中的 hibernate.cfg.xml 识别实体?

application.properties 和 hibernate.cfg.xml 在persistence包的资源中。

0 投票
1 回答
43 浏览

java - 对如何编写模拟器感到困惑

我正在尝试遵循端口和适配器的六边形设计,更具体地说,遵循这种方法:https ://docs.microsoft.com/en-us/archive/blogs/ericgu/unit-test-success-using-ports-adapters -simulatorskata-walkthroughhttps://docs.microsoft.com/en-us/archive/blogs/ericgu/unit-test-success-using-ports-adapters-and-simulators

主要思想是我不想模拟我对 dynamodb 的使用,而是为它创建一个适配器。

给定接口:

并创建了两个实现。这一个实际上使用数据库:

}

虽然这个使用称为 DynamodbLocal 的内存解决方案:

但我的困惑在于模拟器的使用。这个想法似乎是我可以创建一个适用于两个接口的测试,理论上我可以,但初始化将是 Metadata metadata = new Dynamodbv2Metadata(); vs 元数据 metadata = new DynamodbLocalMetadata();

那么有没有办法清理它以便测试可以相同?目前我不确定 DynamodbLocalMetadata 给了我什么,因为代码在本地或服务器上运行时使用 Dynamodbv2Metadata 实现,但它会在单元测试执行时调用 DynamodbLocalMetadata。

任何帮助表示赞赏!