在Golang中管理循环依赖

时间:2018-07-08 17:53:21

标签: go

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

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

accounts
  ...
  handlers
    accounts.go
  models
    account.go
  repos
    account.go

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

在模型内部,我认为进行验证是有意义的。但是,一种验证(例如电子邮件的唯一性)要求使用DAO,该DAO会引发有关循环调度的错误。

我很好奇在这种范例中组织验证的最佳方法是什么?我是否真的应该包括一个用于所有交互的服务层?也就是说,我是否应该拥有一个仅作为Account结构的模型,然后进行验证并在将钩子保存到服务中之前?

2 个答案:

答案 0 :(得分:3)

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

Wikipedia link

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

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

在所有代码层中添加一个服务层,以使用模型和存储库包,这将为您提供一个封装验证模型所需的逻辑规则的地方。还将为您提供一个逻辑位置进行验证。

通常,我主张总是添加服务层。即使它什么也没做。此经验法则提供了一种更灵活的设计,允许更改需求。

答案 1 :(得分:0)

我曾经做过的一件事,尽管我认为它有点骇人听闻,但却是使用接口或函数指针。在您的情况下,它将在您的模型中。

然后在应用程序中更高级的代码中,可以使用模型和DAO而不使用循环引用,由该代码设置接口或函数指针。

模型可以调用该方法而无需其代码。

我想这是依赖注入的一种形式。我自己做时并不满意,但是那是当时最简单的方法。