| name | kratos-wire-provider |
| description | Manages Wire dependency injection providers in go-kratos microservices. Adds constructors to ProviderSets and regenerates Wire code. Use when integrating new components into dependency injection. |
- Add to ProviderSet in
internal/biz/biz.go:
var ProviderSet = wire.NewSet(
NewSymbolValidator,
NewSymbolUseCase,
NewProductUseCase, // Add your constructor
)
- Regenerate Wire code:
cd services/{service-name}
make generate
Data Layer (internal/data/data.go):
- Repository implementations
- Database connection
- Transaction manager
var ProviderSet = wire.NewSet(
NewData, // Database setup
NewTransaction, // Transaction manager
repo.NewSymbolRepo,
repo.NewProductRepo,
)
Business Layer (internal/biz/biz.go):
- Use cases
- Validators
var ProviderSet = wire.NewSet(
NewSymbolValidator,
NewSymbolUseCase,
NewProductUseCase,
)
Service Layer (internal/service/service.go):
- Service handlers
var ProviderSet = wire.NewSet(
NewSymbolService,
NewProductService,
)
Server Layer (internal/server/server.go):
- HTTP and gRPC servers
var ProviderSet = wire.NewSet(
NewHTTPServer,
NewGRPCServer,
)
File: cmd/{service}/wire.go defines dependencies:
//go:build wireinject
func InitApp(*conf.Server, *conf.Data, log.Logger) (*App, error) {
wire.Build(
server.ProviderSet,
service.ProviderSet,
biz.ProviderSet,
data.ProviderSet,
newApp,
)
return &App{}, nil
}
Generated: cmd/{service}/wire_gen.go (auto-generated, never edit)
Command: make generate runs:
GOWORK=off go generate ./cmd/{service}/...
Within ProviderSet:
- Alphabetical order (recommended)
- OR grouped by functionality
- Be consistent with existing pattern
Between ProviderSets (in wire.Build):
server.ProviderSet(outermost layer)service.ProviderSetbiz.ProviderSetdata.ProviderSet(innermost layer)newApp(application constructor)
Add new repository:
- Add constructor to
data.ProviderSet - Run
make generate
Add new use case:
- Add constructor to
biz.ProviderSet - Run
make generate
Add new service handler:
- Add constructor to
service.ProviderSet - Run
make generate
Troubleshooting:
- If Wire errors, check constructor signatures match interface returns
- Ensure all dependencies are provided in ProviderSets
- Check for circular dependencies
- Run
GOWORK=off go mod tidyif module issues
Optional: Use Wire build tags for conditional providers:
//go:build wireinject
// +build wireinject
Providers must:
- Return types that match interface declarations
- Have all parameters available in dependency graph
- Not create circular dependencies
"no provider found for X": → Add constructor for X to appropriate ProviderSet
"cycle in dependency graph": → Circular dependency detected, refactor to break cycle
"provider returns interface but is not implemented": → Check constructor returns interface type, struct implements all methods
"multiple providers for type": → Same type provided by multiple constructors, remove duplicate