在干净架构中,是否允许表示层直接与基础设施层通信?

问题描述 投票:0回答:1

我有一个使用经典的干净架构的应用程序,所有依赖项都按照描述设置(即向内流动)。我希望在我的项目中使用一个外部服务,因此定义了用于在

Infrastructure
层中与该服务交互的功能(与服务交互的对象、一些接口等)。

目前

Presentation
层直接从
Infrastructure
层使用外部服务。

关于此的一个问题是:表示层直接与基础设施层通信是否可以接受,还是一切都必须通过应用层进行?

理想情况下,我希望表示层调用应用程序层,以便我可以重用它可用的一些功能(例如验证等),但由于基础设施层不了解应用程序层,我需要定义应用层对外的服务对象。

我宁愿避免这样做,因为这些是特定于服务的而不是特定于应用程序的。我更愿意将它们定义在最接近它们使用位置的基础设施中。

那么,有没有办法重用基础设施层中为该外部服务定义的接口,或者我只需要吸收它并进行一些重复(即在基础设施层中的外部服务实现的应用程序层中定义接口) )?

asp.net-core asp.net-core-webapi clean-architecture
1个回答
0
投票

在 Clean Architecture 中,您通常希望在应用层定义接口。这是因为您的所有业务逻辑都应该存在于应用程序/域层中并由其决定。它应该定义向外界发送请求和接收响应所需的接口。这使您可以构建应用程序的独特功能,而无需关心如何获取/保留数据、调用外部 api 等。

基础设施层应该了解应用层,以便它可以实现接口。然后,表示层应该调用应用层。根据您希望遵循 CA 原则的教条程度,表示层应该根本不引用/使用基础设施层(在这种情况下,您将使用一些组合根项目来构建 DI 容器),或者应该引用基础设施层仅作为将应用程序接口注册到 DI 容器的基础设施实现的一种方式。

你不应该在应用层定义“外部服务对象”;相反,您只定义应用程序执行其操作所需的域对象和接口。然后,“外部服务”的关注点在基础设施的实现中得到解决,其关注点通常如下所示:

  • 了解如何调用外部服务
  • 拥有向外部服务发送请求和从外部服务接收响应的模型
  • 将应用程序/域请求从应用程序/域映射到外部服务模型
  • 将外部响应映射回某些应用程序/域模型
© www.soinside.com 2019 - 2024. All rights reserved.