'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

go


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