如何在Golang中设置继承



tl; dr

在此示例中,将Store设置为在多个服务之间共享的正确方法是什么:https://github.com/th0th/goblog/blob/2b2d7ac51978de41f3923963963094242424043817a49a49a49d7 d7/

详细信息

问候,我正在尝试通过创建一个简单的MVC-ish博客REST API来理解GO的工作方式。我计划该应用程序由3个包/层组成:

模型

持有数据结构。定义这些结构的数据库访问层的接口。

商店

介绍了实际的数据库连接。从模型中实现界面。所有数据库访问均通过此实现完成。

api

REST与API相关的东西。路线等

我在store软件包中有一个Store struct,该结构可容纳服务:

// Store wraps all services
type Store struct {
    DB *sqlx.DB
    CategoryService CategoryService
    PostService PostService
}

这是CategoryServicePostService也是这样。它们都有CRUD动作的方法。):

// CategoryService represents a service for managing categories.
type CategoryService struct {
    store *Store
}

创建此Store的实例时,我需要设置每个服务的存储。

// New creates and returns new Store
func New() Store {
    var s Store
    db, err := sqlx.Connect("mysql", "<user>:<pass>@(localhost:3306)/goblog")
    if err != nil {
        log.Fatal(err)
    }
    s.DB = db
    s.CategoryService.store = &s
    s.PostService.store = &s
    return s
}

我希望在服务之间共享商店,正确的方法是什么?我做错了吗?

我在您的设计中发现有点奇怪,Store对服务和服务了解Store ...对我来说,双重依赖性看起来不正确,但这可能是主题辩论。

如果我是您,我会从Store中删除服务,并在创建每个服务时将Store作为参数传递。

例如,从商店中删除服务:

type Store struct {
  DB *sqlx.DB
  // no services here
}

...并在创建服务时将Store作为参数传递:

type CategoryService struct {
  store *Store
}
func NewCategoryService(s Store) CategoryService {
  var service CategoryService
  service.store = s
  return service
}
func (service CategoryService) Add()  {
  // service will have access to the store value
  // via service.store
}

最新更新