我有一个使用经典的干净架构的应用程序,所有依赖项都按照描述设置(即向内流动)。我希望在我的项目中使用一个外部服务,因此定义了用于在
Infrastructure
层中与该服务交互的功能(与服务交互的对象、一些接口等)。
目前
Presentation
层直接从Infrastructure
层使用外部服务。
关于此的一个问题是:表示层直接与基础设施层通信是否可以接受,还是一切都必须通过应用层进行?
理想情况下,我希望表示层调用应用程序层,以便我可以重用它可用的一些功能(例如验证等),但由于基础设施层不了解应用程序层,我需要定义应用层对外的服务对象。
我宁愿避免这样做,因为这些是特定于服务的而不是特定于应用程序的。我更愿意将它们定义在最接近它们使用位置的基础设施中。
那么,有没有办法重用基础设施层中为该外部服务定义的接口,或者我只需要吸收它并进行一些重复(即在基础设施层中的外部服务实现的应用程序层中定义接口) )?
在 Clean Architecture 中,您通常希望在应用层定义接口。这是因为您的所有业务逻辑都应该存在于应用程序/域层中并由其决定。它应该定义向外界发送请求和接收响应所需的接口。这使您可以构建应用程序的独特功能,而无需关心如何获取/保留数据、调用外部 api 等。
基础设施层应该了解应用层,以便它可以实现接口。然后,表示层应该调用应用层。根据您希望遵循 CA 原则的教条程度,表示层应该根本不引用/使用基础设施层(在这种情况下,您将使用一些组合根项目来构建 DI 容器),或者应该引用基础设施层仅作为将应用程序接口注册到 DI 容器的基础设施实现的一种方式。
你不应该在应用层定义“外部服务对象”;相反,您只定义应用程序执行其操作所需的域对象和接口。然后,“外部服务”的关注点在基础设施的实现中得到解决,其关注点通常如下所示: