'How to make GO Wire inject the struct with same interface
I have a problem while auto generating wire_gen.go (I can manually create it but want to use auto generating)
My project has a Service, Repository, and Resolver
Repository -> Service -> Resolver
The Service got injected from The Repository
and The Resolver got injected from The Service
Here is my code
Repository
// Icon Repository
type GormRepository struct {
db database.Database
}
func NewGormRepository(db database.Database) *GormRepository {
return &GormRepository{db: db}
}
Service
// Icon Service (I have already Implemented all of these)
type Repository interface {
FindAllIcon(*[]*model.Icon) error
FindOneIcon(int64, *model.Icon) error
CreateIcon(*model.Icon) error
UpdateIcon(int64, *model.Icon) error
DeleteIcon(int64, *model.Icon) error
}
type Service struct {
repository Repository
validatorService service.ValidatorService
}
func NewIconService(repository Repository, validatorService service.ValidatorService) Service {
return Service{
repository: repository,
validatorService: validatorService,
}
}
// Validator Service
func NewValidatorService() Service {
return Service{}
}
type Service struct{}
Resolver
// Resolver
type Resolver struct {
iconService icon.Service
}
func NewResolver(iconService icon.Service) *Resolver {
return &Resolver{
iconService: iconService,
}
}
wire.go
// wire.go
func InitializeResolver(db database.Database) (*graph.Resolver, error) {
wire.Build(graph.NewResolver, icon.NewIconService, repository.NewGormRepository, service.NewValidatorService)
return &graph.Resolver{}, nil
}
wire_gen.go (manually create and didn't get any error)
func InitializeResolver(db database.Database) (*graph.Resolver, error) {
gormRepository := repository.NewGormRepository(db)
validatorService := service.NewValidatorService()
iconService := icon.NewIconService(gormRepository, validatorService)
resolver := graph.NewResolver(iconService)
return resolver, nil
}
This is an error that I have got
wire: C:\Computer Programing\Samithiwat\samithiwat-app-backend\src\wire.go:43:1: inject InitializeResolver: no provider found for github.com/samithiwat/samithiwat-backend/src/service/i
con.Repository
needed by github.com/samithiwat/samithiwat-backend/src/service/icon.Service in provider "NewIconService" (C:\Computer Programing\Samithiwat\samithiwat-app-backend\src\service\i
con\icon-decoration.service.go:24:6)
Do you guys have any idea to fix this error, thanks for you help in advance
Solution 1:[1]
You need to bind the interface to struct that implements the interface.
// wire.go
func InitializeResolver(db database.Database) (*graph.Resolver, error) {
set := wire.NewSet(repository.NewGormRepository, wire.Bind(new(service.Repository), new(*repository.NewGormRepository)))
wire.Build(set, graph.NewResolver, icon.NewIconService, service.NewValidatorService)
return &graph.Resolver{}, nil
}
(PS: I've not tested this on my machine, may contain syntax/compilation err)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | advay rajhansa |
