3 回答

TA贡献1842条经验 获得超22个赞
您可以在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

TA贡献1883条经验 获得超3个赞
期望Interactors(用例类)调用其他interactors。因此,这两种方法都遵循清洁架构原则。
但是,“也许在未来”这句话与良好的设计和架构实践背道而驰。
我们可以而且应该以最抽象的方式思考,以便我们可以支持重用。但始终保持简单,避免不必要的复杂性。
如果 GetHotelInfo 的实际逻辑不是 3 个端点的组合而是 10 个端点的组合,答案会不会有所不同?
不,它会是一样的。但是,在您设计 API 时,如果您需要组合数十个端点,您应该开始考虑放置一个 GraphQL 层,而不是增加项目的复杂性。

TA贡献1860条经验 获得超8个赞
清洁不是一个定义明确的术语。相反,您的目标应该是尽量减少更改(添加或删除服务)的影响。我所说的“影响”不仅是指成本和时间因素,还包括引入回归的风险(破坏系统的不同部分,你不应该接触)。
为了最大限度地减少“变化的影响”,您可以将它们拆分为单独的服务/有界上下文,并只允许通过事件进行交互。“控制器”会引发一个事件(在共享总线上),如“酒店信息请求”,每个单独的服务(属性、价格和评论)将独立且异步地响应(可能在同一总线上),让控制器汇总结果并将它们返回给客户端,这可以在一段时间后完成。如果您对结果聚合器进行适当的编码,则可以添加新的“功能”或完全独立于其他功能删除现有功能。
为了改进这一点,您可以将每个上下文的读取和写入功能分离到它自己的上下文中,每个上下文都响应适当的事件。这将允许您独立于读取功能优化和扩展写入功能。我们称之为 CQRS。
- 3 回答
- 0 关注
- 181 浏览
添加回答
举报