如何在golang中设置继承

时间:2017-11-30 09:53:04

标签: inheritance go

TL;博士

在此示例中,在多个服务之间设置Store的正确方法是什么:https://github.com/th0th/goblog/blob/2b2d7ac51978de41f392396309424043817a49d7/store/store.go#L29

详细

问候,我试图通过创建一个简单的MVC-ish博客REST API来理解如何运作。我已经计划应用程序包含3个包/层:

模型

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

存储

显示实际的数据库连接。从模型实现接口。所有数据库访问都是通过此实现完成的。

API

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

我在Store包中有一个store结构,它包含服务:

// 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
}

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

1 个答案:

答案 0 :(得分:2)

我的设计中有点奇怪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
}