(Golang)干净的建筑——谁来指挥?
我试图了解以下两个选项中的哪一个是正确的方法以及原因 假设我们有(Golang)干净的建筑——谁来指挥?,go,model-view-controller,architecture,use-case,clean-architecture,Go,Model View Controller,Architecture,Use Case,Clean Architecture,我试图了解以下两个选项中的哪一个是正确的方法以及原因 假设我们有GetHotelInfo(hotel\u id)API,它一直从Web调用到控制器 GetHotelInfo的逻辑是: 调用GetHotelPropertyData()(位置、设施…) 调用GetHotelPrice(酒店id、日期…) 调用GetHotelReviews(酒店id) 所有结果返回后,处理并合并数据,并返回一个包含酒店所有相关数据的对象 选项1: 创建3个不同的存储库(HotelPropertyRepo、Hote
GetHotelInfo(hotel\u id)
API,它一直从Web调用到控制器
GetHotelInfo的逻辑是:
GetHotelPropertyData()
(位置、设施…)GetHotelPrice(酒店id、日期…)
GetHotelReviews(酒店id)
- 创建3个不同的存储库(HotelPropertyRepo、HotelPriceRepo、, 酒店评论(REPO)
- 创建将使用这3个存储库和 返回最终结果
- 创建3个不同的存储库(HotelPropertyRepo、HotelPriceRepo、, 酒店评论(REPO)
- 创建3个不同的用例(GetHotelPropertyDataUseCase, GetHotelPriceUseCase、GetHotelReviewUseCase)
- 创建GetHotelInfo数据库,该数据库将协调前3个数据库 用例。(它也可以是控制器,但这是另一个主题)
GetHotelInfo
向Web公开,但可能在将来,我也会公开一些内部请求
如果GetHotelInfo的实际逻辑不是3个端点的组合,而是10个端点的组合,答案会有所不同吗?您可以在“from”中看到类似的方法(称为
Get()
)
马纳托指出:
- 接下来,依赖项在圆中只指向内部,不指向外部,也没有循环
- 该控制器和演示器依赖于用例输入端口和输出端口,它们被定义为接口,而不是特定的逻辑(细节)。这是可能的(不知道外层的细节),这要归功于
- 存储库
- 演示者:负责输出端口
- interactor:负责输入端口,根据存储库和演示者界面,提供一组特定应用程序业务规则的方法
您可以使用该示例来调整您的案例,首先在
hotel\u interactitor.go
文件中声明GetHotelInfo
,根据hotel\u存储库中声明的特定业务方法,以及hotel\u presenter
中定义的响应,Clean不是一个定义良好的术语。相反,您应该将更改(添加或删除服务)的影响降至最低。我所说的“影响”不仅指成本和时间因素,还指引入回归的风险(破坏系统中你不想触及的不同部分)
为了最大限度地减少“变化的影响”,您可以将这些划分为单独的服务/有界上下文,并且只允许通过事件进行交互。“控制器”将引发一个事件(在共享总线上),如“酒店信息请求”,每个单独的服务(酒店、价格和评论)将独立和异步响应(可能在同一总线上),让控制器汇总结果并返回给客户机,这可以在一段时间后完成。如果对结果聚合器进行适当编码,则可以添加新的“功能”或完全独立于其他功能删除现有功能
为了改进这一点,您可以将每个上下文的读写功能分离到自己的上下文中,每个上下文都响应相应的事件。这将允许您独立于读取功能优化和缩放写入功能。我们称之为CQR。是预期的交互者(用例类)调用其他交互者。因此,这两种方法都遵循干净的体系结构原则
但是,“也许在未来”“这句话与良好的设计和架构实践背道而驰
我们可以也应该以最抽象的方式思考,这样我们才能支持重用。但要始终保持简单,避免不必要的复杂性
如果GetHotelInfo的实际逻辑不是3个端点的组合,而是10个端点的组合,那么答案会有所不同吗
不,是一样的。但是,在设计API时,如果需要几十个端点的组合,您应该开始考虑放置一个GraphQL层,而不是增加项目的复杂性。问题是聚合部分中有很多逻辑,这就是为什么我不认为它应该在控制器中,因为控制器层不应该包含业务逻辑。这就是我将聚合逻辑放在专用用例中的原因。问题是这个用例“GetHotelInfoUseCae”应该协调其他用例还是直接协调存储库。所以,如果我错了,请纠正我,但你实际上是说选项1是正确的选择。@Sash那将是最接近的,是的。但我会尝试在用例层中调整存储库/呈现者/交互者模型。