管理 golang 中的循环依赖

use*_*553 3 go

我无法理解在 golang 中组织应用程序依赖结构的最佳方法。

本质上,我的应用程序的结构如下:

accounts
  ...
  handlers
    accounts.go
  models
    account.go
  repos
    account.go
Run Code Online (Sandbox Code Playgroud)

现在我有一个用于帐户的数据库访问对象 (DAO) 设置,我想避免将验证逻辑放在那里,因为这更适合模型域。存储库旨在仅处理与数据库的交互。

在模型内部,我认为进行验证是有意义的。然而,一项验证(例如电子邮件的唯一性)需要使用 DAO,这会引发有关循环依赖的错误。

我很好奇在这个范例中组织验证的最佳方法是什么?我真的应该为任何交互添加一个服务层吗?也就是说,我是否应该有一个仅是帐户结构的模型,然后进行验证并在服务中保存挂钩之前?

Zak*_*Zak 5

采用三层架构可以帮助缓解您遇到的一些问题。

维基百科链接

您遇到问题的原因是没有一个地方可以验证您的模型。没有一个地方可以提取执行验证所需的所有信息。

验证(几乎总是)基于一组业务规则(或逻辑规则)。这些规则与数据结构(由 models 包拥有)或数据存储(由 dao 层拥有)无关。

将服务层添加到所有代码层,以使用模型和存储库包将为您提供一个地方来封装验证模型所需的逻辑规则。它还将为您提供用于此验证的单一逻辑位置。

一般来说,我主张始终添加服务层。即使它什么也没做。这个经验法则提供了更灵活的设计,允许需求发生变化。