go - (Golang)清洁架构 - 谁应该做编排?
问题描述
我试图了解以下两个选项中的哪一个是正确的方法以及为什么。
假设我们有GetHotelInfo(hotel_id)
从 Web 调用到 Controller 的 API。
GetHotelInfo 的逻辑是:
- 调用
GetHotelPropertyData()
(位置、设施……) - 调用
GetHotelPrice(hotel_id, dates…)
- 调用
GetHotelReviews(hotel_id)
一旦所有结果返回,处理并合并数据并返回包含酒店所有相关数据的 1 个对象。
选项 1:
创建 3 个不同的存储库(HotelPropertyRepo、HotelPriceRepo、HotelReviewsRepo)
创建将使用这 3 个存储库并返回最终结果的 GetHotelInfo 用例。
选项 2:
创建 3 个不同的存储库(HotelPropertyRepo、HotelPriceRepo、HotelReviewsRepo)
创建 3 个不同的用例(GetHotelPropertyDataUseCase、GetHotelPriceUseCase、GetHotelReviewsUseCase)
创建将协调前 3 个用例的 GetHotelInfoUseCase。(它也可以是一个控制器,但这是一个不同的主题)
假设现在只GetHotelInfo
向 Web 公开,但也许在将来,我也会公开一些内部请求。
如果 GetHotelInfo 的实际逻辑不是 3 个端点的组合而是 10 个端点的组合,答案会不会有所不同?
解决方案
您可以在Manato Kuroda的“ Clean Architecture with GO ”中看到类似的方法(称为Get()
)
马纳托指出:
- 遵循非循环依赖原则(ADP),依赖在循环中只指向内部,不指向外部,没有循环。
- Controller 和 Presenter 依赖于用例输入端口和输出端口,它们被定义为接口,而不是特定的逻辑(细节)。由于依赖倒置原则(DIP),这是可能的(不知道外层的细节) 。
这就是为什么在示例存储库manakuro/golang-clean-architecture
中,Manato 为用例层创建了三层目录:
- 存储库,
- 主持人:负责输出端口
- interactor:负责Input Port,有一套具体应用业务规则的方法,依赖于repository和presenter接口。
您可以使用该示例来调整您的案例,GetHotelInfo
首先在hotel_interactor.go
文件中声明,并取决于在中声明的特定业务方法hotel_repository
,以及在中定义的响应hotel_presenter
推荐阅读
- javascript - 回调,JS执行顺序
- r - dplyr::mutate(cur_group_id) 无法识别分组
- https - 由 MBEDTLS 生成的 Chrome 拒绝证书
- javascript - 如何在javascript中放置laravel echo函数
- powershell - 运行 generate-vapid-keys --json web-push 时如何解决错误?
- android - ViewModel 中的 LiveData 类型不匹配
- angular - 从角度到后端的社交登录(laminas api 工具)
- ethereum - web3 encodeFunctionCall 不起作用(在 1 个事务中同时调用 2 个特定函数不起作用)
- javascript - SecurityError:无法在“HTMLCanvasElement”上执行“toBlob”:可能无法导出受污染的画布
- assembly - MIPS 从地址加载值