在此示例中,在多个服务之间设置Store
的正确方法是什么:https://github.com/th0th/goblog/blob/2b2d7ac51978de41f392396309424043817a49d7/store/store.go#L29
问候,我试图通过创建一个简单的MVC-ish博客REST API来理解如何运作。我已经计划应用程序包含3个包/层:
保存数据结构。定义这些结构的数据库访问层的接口。
显示实际的数据库连接。从模型实现接口。所有数据库访问都是通过此实现完成的。
REST API相关的东西。路线等。
我在Store
包中有一个store
结构,它包含服务:
// 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
}
我希望商店在服务之间共享,正确的方法是什么?我做错了吗?
答案 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
}