(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)
  • 所有结果返回后,处理并合并数据,并返回一个包含酒店所有相关数据的对象

    选项1

    • 创建3个不同的存储库(HotelPropertyRepo、HotelPriceRepo、, 酒店评论(REPO)

    • 创建将使用这3个存储库和 返回最终结果

    选项2

    • 创建3个不同的存储库(HotelPropertyRepo、HotelPriceRepo、, 酒店评论(REPO)

    • 创建3个不同的用例(GetHotelPropertyDataUseCase, GetHotelPriceUseCase、GetHotelReviewUseCase)

    • 创建GetHotelInfo数据库,该数据库将协调前3个数据库 用例。(它也可以是控制器,但这是另一个主题)

    假设现在只有
    GetHotelInfo
    向Web公开,但可能在将来,我也会公开一些内部请求


    如果GetHotelInfo的实际逻辑不是3个端点的组合,而是10个端点的组合,答案会有所不同吗?

    您可以在“from”中看到类似的方法(称为
    Get()

    马纳托指出:

    • 接下来,依赖项在圆中只指向内部,不指向外部,也没有循环
    • 该控制器和演示器依赖于用例输入端口和输出端口,它们被定义为接口,而不是特定的逻辑(细节)。这是可能的(不知道外层的细节),这要归功于

    这就是为什么在示例存储库中,Manato为用例层创建了三个目录:

    • 存储库
    • 演示者:负责输出端口
    • interactor:负责输入端口,根据存储库和演示者界面,提供一组特定应用程序业务规则的方法

    您可以使用该示例来调整您的案例,首先在
    hotel\u interactitor.go
    文件中声明
    GetHotelInfo
    ,根据
    hotel\u存储库中声明的特定业务方法,以及
    hotel\u presenter
    中定义的响应,Clean不是一个定义良好的术语。相反,您应该将更改(添加或删除服务)的影响降至最低。我所说的“影响”不仅指成本和时间因素,还指引入回归的风险(破坏系统中你不想触及的不同部分)

    为了最大限度地减少“变化的影响”,您可以将这些划分为单独的服务/有界上下文,并且只允许通过事件进行交互。“控制器”将引发一个事件(在共享总线上),如“酒店信息请求”,每个单独的服务(酒店、价格和评论)将独立和异步响应(可能在同一总线上),让控制器汇总结果并返回给客户机,这可以在一段时间后完成。如果对结果聚合器进行适当编码,则可以添加新的“功能”或完全独立于其他功能删除现有功能

    为了改进这一点,您可以将每个上下文的读写功能分离到自己的上下文中,每个上下文都响应相应的事件。这将允许您独立于读取功能优化和缩放写入功能。我们称之为CQR。

    是预期的交互者(用例类)调用其他交互者。因此,这两种方法都遵循干净的体系结构原则

    但是,“也许在未来”“这句话与良好的设计和架构实践背道而驰

    我们可以也应该以最抽象的方式思考,这样我们才能支持重用。但要始终保持简单,避免不必要的复杂性

    如果GetHotelInfo的实际逻辑不是3个端点的组合,而是10个端点的组合,那么答案会有所不同吗


    不,是一样的。但是,在设计API时,如果需要几十个端点的组合,您应该开始考虑放置一个GraphQL层,而不是增加项目的复杂性。

    问题是聚合部分中有很多逻辑,这就是为什么我不认为它应该在控制器中,因为控制器层不应该包含业务逻辑。这就是我将聚合逻辑放在专用用例中的原因。问题是这个用例“GetHotelInfoUseCae”应该协调其他用例还是直接协调存储库。所以,如果我错了,请纠正我,但你实际上是说选项1是正确的选择。@Sash那将是最接近的,是的。但我会尝试在用例层中调整存储库/呈现者/交互者模型。