Node.js 清洁体系结构:在何处进行API调用

Node.js 清洁体系结构:在何处进行API调用,node.js,microservices,clean-architecture,Node.js,Microservices,Clean Architecture,我目前正在创建一个microservices项目,在该项目中,我实现了bobmartin创造的干净体系结构模式。虽然我的代码工作得很好,但我对干净的体系结构模式有一个疑问,特别是接口和用例层。该应用程序是一个小的电子商务POC我的工作。也就是说,由于它正在实现微服务,我有3种不同的服务。产品、图像和评论。每当请求获取“完整产品”时,客户端将ping完整产品的端点,它将获取该端点,并使用其id ping my Images and Reviews services获取该产品的所有图像和评论 那么,

我目前正在创建一个microservices项目,在该项目中,我实现了bobmartin创造的干净体系结构模式。虽然我的代码工作得很好,但我对干净的体系结构模式有一个疑问,特别是接口和用例层。该应用程序是一个小的电子商务POC我的工作。也就是说,由于它正在实现微服务,我有3种不同的服务。产品、图像和评论。每当请求获取“完整产品”时,客户端将ping完整产品的端点,它将获取该端点,并使用其id ping my Images and Reviews services获取该产品的所有图像和评论

那么,我的问题是,我应该在哪里实现创建这些调用的逻辑?我的直觉告诉我应该把它放在控制器层,因为这是两个层中最抽象的一个,如果把axios依赖项放在控制器层中,我也不会觉得很糟糕。但遗憾的是,我也觉得“一个完整的产品必须包括产品细节、图片和所有评论”这句话听起来很像一条商业规则

我知道这个问题主要是主观的,但我想知道你是如何实现这个逻辑的,为什么


我还应该提到,在我当前的解决方案中,我的用例是调用存储库并实际从数据库中获取产品。也就是说,如果我将API调用放入控制器层,我必须首先调用我的用例来获取产品,然后可能创建一个单独的用例来检查我的最终对象是否是“完整产品”.

从产品用例的角度获取图像和评论就像访问数据库一样。唯一的区别是您不查询数据库,而是查询另一个服务。但从产品微服务的角度来看,两者都是向用例提供数据的外部系统

当您查看干净的体系结构时,您将意识到控制器和网关位于同一体系结构层——接口适配器。该层被命名为“接口适配器”,因为它适应较低层的接口

正如您所见,网关可以是DB或外部接口(服务)

因此,您应该以以下方式构建应用程序:

                       +------------------+
                       | product use case |
                       +------------------+
                                |
             +------------------+---------------------+
             |                  |                     |
             V                  V                     V
    +-----------------+ +------------------+ +-------------------+
    | ImageRepository | | ReviewRepository | | ProductRepository |
    +-----------------+ +------------------+ +-------------------+
            ^                     ^                    ^
            |                     |                    |
 ===========+=====================+====================+================
            |                     |                    |
 +--------------------+ +--------------------+ +--------------------+
 |   ImageRestClient  | | ReviewRestClient   | |   JDBCConnector    |
 +--------------------+ +--------------------+ +--------------------+
您可能希望选择另一个命名,但结构通常保持不变


易于测试,如果有一天您决定在产品微服务中而不是单独的服务中管理图像,您可以用
JDBCConnector
替换
ImageRestClient
,这是一个很好的答案!非常感谢你!确实有助于消除一些困惑。有时很容易混淆用例和接口层!