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
}
这是CategoryService
(PostService
也是这样。它们都有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
}