需求
database,假设有两个实现,redis跟MySQL
userService用Redis的实现,
groupService用MySQL的实现。
问题:
不管我怎么配置,始终无法实现这个需求
database
import "fmt"
type Database interface {
GetById(id string) map[string]interface{}
}
// ===== 模拟redis =====
var _ Database = (*RedisData)(nil)
type RedisData struct {
}
func NewRedisData() Database {
fmt.Println("===== NewRedisData =====")
return &RedisData{}
}
func (r *RedisData) GetById(id string) map[string]interface{} {
fmt.Println("redis GetById " + id)
return map[string]interface{}{
"id": id,
"name": "redis",
}
}
// ===== 模拟MySQL =====
var _ Database = (*MySqlData)(nil)
type MySqlData struct {
}
func NewMySqlData() Database {
fmt.Println("===== NewMySqlData =====")
return &MySqlData{}
}
func (r *MySqlData) GetById(id string) map[string]interface{} {
fmt.Println("mysql GetById " + id)
return map[string]interface{}{
"id": id,
"name": "mysql",
}
}
userService
type User struct {
Id string `json:"id"`
Name string `json:"name"`
}
type UserService interface {
GetUser(id string) *User
}
var _ UserService = (*userService)(nil)
type userService struct {
db Database
}
func NewUserService(db Database) UserService {
return &userService{db: db}
}
func (u *userService) GetUser(id string) *User {
data := u.db.GetById(id)
return toUser(data)
}
func toUser(data map[string]interface{}) *User {
u := &User{
Id: data["id"].(string),
Name: data["name"].(string),
}
return u
}
groupService
type Group struct {
Id string `json:"id"`
Name string `json:"name"`
}
type GroupService interface {
GetGroup(id string) *Group
}
var _ GroupService = (*groupService)(nil)
type groupService struct {
db Database
}
func NewGroupService(db Database) GroupService {
return &groupService{db: db}
}
func (u *groupService) GetGroup(id string) *Group {
data := u.db.GetById(id)
return toGroup(data)
}
func toGroup(data map[string]interface{}) *Group {
u := &Group{
Id: data["id"].(string),
Name: data["name"].(string),
}
return u
}
app
import "fmt"
type App struct {
db Database
userService UserService
groupService GroupService
}
func NewApp(
db Database,
userService UserService,
groupService GroupService,
) *App {
return &App{
db: db,
userService: userService,
groupService: groupService,
}
}
func (a *App) Run() {
fmt.Println("app run")
}
provider
import (
"github.com/google/wire"
)
var ProviderSet = wire.NewSet(NewUserService, NewRedisData, NewGroupService, NewMySqlData, NewApp)
func InitializeApp() *App {
wire.Build(ProviderSet)
return nil
}