kratos-wire-provider
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.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
<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, // Add your constructor
)
- 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, // 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,
)
</provider_sets>
<wire_process>
Wire Generation Process
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}/...
</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 tidyif module issues </common_tasks>
<wire_annotations>
Wire Annotations
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 </wire_annotations>
<success_criteria> Wire integration is successful when:
- Constructor added to appropriate ProviderSet
- Alphabetical/consistent ordering maintained
-
make generatecompletes without errors -
wire_gen.goupdated successfully - Service compiles:
make build - Tests pass:
make test - No circular dependency errors </success_criteria>
<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>
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!