问题标签 [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.
java - 支持六边形/端口和适配器架构的 JEE 服务器
我想在端口和适配器架构(也称为洋葱、六边形或干净架构)中编写 JEE 应用程序。所以我想通过接口而不是实现来注入依赖项。当然,实现是在单独的 Maven 模块中而不是接口中。
问题是wildfly不支持这一点。您知道任何无需任何管道配置即可在该基础架构中工作的服务器吗?
任何帮助欣赏。
exception-handling - 我的域异常应该从应用层抛出吗?
我正在阅读 Vaughn Vernon 的书 - 实施领域驱动设计。有一个项目管理应用程序的示例。有 BacklogItem、Sprint 等聚合。如果我在域层中定义了 BacklogItemNotFoundException。我的 Rest 适配器是否应该捕获它并转换为 NotFoundHttpResult?或者任何其他损坏的不变异常,例如:EmailPatternBrokenException 或 TooManyCharactersForNameException 或任何应该在 Rest 适配器(端口和适配器架构)中处理并重新转换为 rest 响应的东西?如果是,是否意味着 RestAdapter 应该有对 Domain 层的引用?这是困扰我的...
php - 域映射 - 将模型从外部软件转换为内部结构
我目前正在开发一个 php 框架,以抽象并使其有趣且易于使用我公司咨询的外部软件 ($ES)。我的方法是六边形设计模式,到目前为止效果很好。我唯一关心的是将实体从 $ES 映射(以及映射到哪里)到我们的内部结构。
示例:$externalSoftwareProduct(处理所有事情的神类)映射到 $internalFrameworkProduct(以及许多其他用于拆分职责的类)。这发生在存储库中。在每个存储库方法中,我从 $ES 收集这些实体并执行
foreach 我收集的实体然后返回。在这些存储库中,只有通用方法,例如 getById、getAll,您可以命名它。
现在我们在客户项目中使用这个框架,并使用特定领域的扩展来扩展这些基类,比如 CustomerNameProductRepository。在那里,您可以找到特定领域的方法,例如 getProductsCustomerAlwaysNeeds 等。在这些方法的最后,我们将 $internalFrameworkProduct 映射到 $customerSpecificProduct ,它保存数据以便于访问,这是必需的。此特定存储库中的方法如下所示。
现在到目前为止这工作正常。唯一的问题是单元测试。我们正在使用 phpunit + Mockery。为了模拟那些新创建的实例,我们必须使用 mock(overload:externalSoftwareProduct) 和 mock(overload: CustomerSpecificProduct) 这总是很痛苦(特别是如果您尝试使用多个实例进行测试,这是不时需要的) .
你会如何处理这个问题?必须有更好的方法来连接这 3 部分(externalSoftwareProduct、internalFrameworkProduct 和 CustomerSpecificProduct(它扩展了 internalFrameworkProduct))。
我正在考虑为 CustomerSpecificProduct 使用工厂,以便模拟工厂并让它吐出我的产品。但我觉得我过度设计了这样一个简单的任务。
design-patterns - 洋葱架构的 DDD 端口和适配器,哪里去了?
试图弄清楚一些概念却无法理解
端口和适配器架构中的用例是什么?
用例的实现会是什么样子?
什么是用例关注点?
它在基础设施或领域中的位置,它说它在应用程序中,那么根据我的理解,应用程序核心和应用程序服务是不同的?
在左侧,适配器依赖于端口并被注入端口的具体实现,其中包含用例。在这一方面,端口及其具体实现(用例)都属于应用程序内部;
https://herbertograca.com/2017/09/14/ports-adapters-architecture/#what-is-a-port
这句话让我很困惑……因为据我了解,主适配器可以是任何要求您的业务逻辑(它对您提供的内容感兴趣)WebAPI、MVC、测试、ConsoleApp。
在左侧,适配器依赖于端口并被注入包含用例的端口的具体实现。
所以我假设它指的是你的业务逻辑被注入让我们说一个 WebApiController 构造函数
在这一方面,端口及其具体实现(用例)都属于应用程序内部;
所以呢 ?这是谁
应用
是 WebApi 吗?还是域?我理解的用例也是我的业务逻辑的实现,所以例如设计会是这样的吗?
所以 WebApiController 将使用 ImplementingPrimaryAdapter 提供的实现,而不是我的域中的东西?我不明白
请解释 。
c# - 从具有六边形架构(端口和适配器)的多个数据源加载对象
描述
我正在处理一个有近 40 年历史的项目,其中包含大量遗留代码。多年来,添加了多个数据库。现在我正在逐步将其转换为带有端口和适配器的六边形架构。
到目前为止,我总是为每个数据库创建 1 个适配器。但是使用这段代码这样做会给我一个我的域中我的数据库结构的表示(我不想要)。
例子
如果我的域中有一个 Product 对象,看起来像这样:
在这种情况下,价格可能来自数据库 1,描述表来自数据库 2,名称来自数据库 3。所有这些都由唯一代码链接。
问题
我将如何在六边形架构中做到这一点?我是不是该:
制作 1 个具有多个存储库的 productAdapter(每个数据库 1 个)
为每个数据库制作一个适配器并合并我的域中的所有内容(这给出了与我的数据库结构相关的域代码)
为每个数据库和调用数据库适配器的 productAdapter 制作一个适配器?
我希望描述、示例和问题有意义
architecture - 洋葱架构 - 每个人都可以分层访问每个接口(打破层依赖性)吗?
我一直在研究和实现被称为洋葱架构(http://jeffreypalermo.com/blog/the-onion-architecture-part-3/)的模式。
如果我理解正确,让我质疑的一件事是:
所有接口都在核心程序集中定义。实现可以在其他程序集中实现,并将与 IOC 容器链接。
由于所有接口都在 Core 中定义,并且所有程序集都引用 Core,这是否意味着每个程序集都可以访问每个接口?
即,理论上您可以将 UI 服务导入 DAL,因为 DAL 可以访问 UI 服务接口并将其由 IOC 容器解析。
这不是有点破坏分层设计的目的吗?在传统模型中,这是不可能的,因为 DAL 程序集不引用 UI 程序集。
我是否误解了某些东西,或者这种“滥用”在 Onion 架构中是否可能与普通的 N 层架构相反?
java - 如何防止某些包在 ArchUnit 中使用 spring?
如果我想通过ArchUnit使某个 Java 包不受 3rd 方依赖项的影响,我该怎么做?
更具体地说,我正在考虑将我的域模型保持在一个没有弹簧代码的六边形架构中。我指定了一些我认为应该阻止模型使用弹簧的规则。但是,我可以像使用 spring 注释一样@Component
并且@Bean
不会导致违规。
到目前为止我尝试的是
也
这里的代码示例可以很好地执行测试,尽管com.example.app.domain.Factory
正在导入org.springframework...
.
c# - 我是否正确理解端口和适配器/六角架构?
端口和适配器架构旨在构建解耦代码。Domain 层不直接依赖于 Infrastructure 层,而是依赖于端口(接口),端口的实现在 Infrastructure 层,对吗?
我的文件夹结构如下:
我的 UI 项目
应用程序核心项目,包含应用程序服务、领域服务和领域模型。
端口项目:它包含严格的接口。
一个基础设施项目,我在那里有一个持久性文件夹。
交付机制可以切换(从控制台应用程序到 Web 应用程序...),核心仍然可以正常工作。
基础架构也是如此,我可以使用一次实体框架,然后切换到 dapper,而不会导致核心发生变化。
到目前为止一切都很好,还是我错过了一些东西,或者我错过了对架构的基本理解?
现在代码明智:
如果我有一个控制台应用程序,我必须在其中键入命令并创建一个客户。
核心项目中的应用程序服务中的一个类。它使用依赖注入来访问 IPersistence 的实现。
端口项目中的接口。
接口项目中的实现。
端口项目是否应该严格关于接口?您如何构建(文件夹结构)您的端口和适配器项目?
c# - 六边形/洋葱架构域中业务对象的访问者?
我正在使用六边形架构,我想知道访问者模式会如何尊重它?
被访问对象是域对象,但访问者旨在将所述域对象实现动态分派到域对象和数据传输对象之间的适当映射器。
我的第一个想法是将访问者的抽象暴露到域中,并将其实际实现留在基础架构中,类似于存储库。
它不是将基础设施暴露到域中吗?访问者模式是实现细节,对吧?它没有带来任何商业价值,所以它不属于域,不是吗?但是我需要在我的业务对象中使用接受方法来实现这种模式。
你对此有什么想法?
编辑代码示例(C# 语法,但没什么花哨的):
event-handling - 应该在哪里实施确切的端口?
在使用六角架构的 DDD 实现中,应用程序可能具有端口(接口)和适配器(客户端)。在我当前的项目中,我正在实现基于事件驱动的微服务。我有一个域应用程序服务层和基础设施层和适配器层(用于命令侦听器)。我搜索了许多实现和基础设施层,其中包含适配器和端口。现在基础设施层一次将调用应用程序服务层,根据我的理解这是错误的。
这是正确的实现吗?在哪里添加端口/命令侦听器。