| 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 constructor functions to appropriate Wire ProviderSets and regenerate dependency injection code for go-kratos microservices.
<quick_start>
To add a provider to the biz layer:
- Add to ProviderSet in
internal/biz/biz.go:
var ProviderSet = wire.NewSet(
NewSymbolValidator,
NewSymbolUseCase,
NewProductUseCase,
)
- Regenerate Wire code:
cd services/{service-name}
make generate
</quick_start>
<provider_sets>
ProviderSet Locations
Data Layer (internal/data/data.go):
- Repository implementations
- Database connection
- Transaction manager
var ProviderSet = wire.NewSet(
NewData,
NewTransaction,
repo.NewSymbolRepo,
repo.NewProductRepo,
)
Business Layer (internal/biz/biz.go):
var ProviderSet = wire.NewSet(
NewSymbolValidator,
NewSymbolUseCase,
NewProductUseCase,
)
Service Layer (internal/service/service.go):
var ProviderSet = wire.NewSet(
NewSymbolService,
NewProductService,
)
Server Layer (internal/server/server.go):
var ProviderSet = wire.NewSet(
NewHTTPServer,
NewGRPCServer,
)
</provider_sets>
<wire_process>
Wire Generation Process
File: cmd/{service}/wire.go defines dependencies:
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}/...
</wire_process>
<ordering_rules>
Provider Ordering
Within ProviderSet:
- Alphabetical order (recommended)
- OR grouped by functionality
- Be consistent with existing pattern
Between ProviderSets (in wire.Build):
server.ProviderSet (outermost layer)
service.ProviderSet
biz.ProviderSet
data.ProviderSet (innermost layer)
newApp (application constructor)
</ordering_rules>
<common_tasks>
Common Tasks
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 tidy if module issues
</common_tasks>
<wire_annotations>
Wire Annotations
Optional: Use Wire build tags for conditional providers:
Providers must:
- Return types that match interface declarations
- Have all parameters available in dependency graph
- Not create circular dependencies
</wire_annotations>
<success_criteria>
Wire integration is successful when:
<error_messages>
Common Wire Errors
"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
</error_messages>