--- 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. To add a provider to the biz layer: 1. **Add to ProviderSet** in `internal/biz/biz.go`: ```go var ProviderSet = wire.NewSet( NewSymbolValidator, NewSymbolUseCase, NewProductUseCase, // Add your constructor ) ``` 2. **Regenerate Wire code**: ```bash cd services/{service-name} make generate ``` ## ProviderSet Locations **Data Layer** (`internal/data/data.go`): - Repository implementations - Database connection - Transaction manager ```go var ProviderSet = wire.NewSet( NewData, // Database setup NewTransaction, // Transaction manager repo.NewSymbolRepo, repo.NewProductRepo, ) ``` **Business Layer** (`internal/biz/biz.go`): - Use cases - Validators ```go var ProviderSet = wire.NewSet( NewSymbolValidator, NewSymbolUseCase, NewProductUseCase, ) ``` **Service Layer** (`internal/service/service.go`): - Service handlers ```go var ProviderSet = wire.NewSet( NewSymbolService, NewProductService, ) ``` **Server Layer** (`internal/server/server.go`): - HTTP and gRPC servers ```go var ProviderSet = wire.NewSet( NewHTTPServer, NewGRPCServer, ) ``` ## Wire Generation Process **File**: `cmd/{service}/wire.go` defines dependencies: ```go //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: ```bash GOWORK=off go generate ./cmd/{service}/... ``` ## Provider Ordering **Within ProviderSet**: - Alphabetical order (recommended) - OR grouped by functionality - Be consistent with existing pattern **Between ProviderSets** (in wire.Build): 1. `server.ProviderSet` (outermost layer) 2. `service.ProviderSet` 3. `biz.ProviderSet` 4. `data.ProviderSet` (innermost layer) 5. `newApp` (application constructor) ## Common Tasks **Add new repository**: 1. Add constructor to `data.ProviderSet` 2. Run `make generate` **Add new use case**: 1. Add constructor to `biz.ProviderSet` 2. Run `make generate` **Add new service handler**: 1. Add constructor to `service.ProviderSet` 2. 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 ## Wire Annotations **Optional**: Use Wire build tags for conditional providers: ```go //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 integration is successful when: - [ ] Constructor added to appropriate ProviderSet - [ ] Alphabetical/consistent ordering maintained - [ ] `make generate` completes without errors - [ ] `wire_gen.go` updated successfully - [ ] Service compiles: `make build` - [ ] Tests pass: `make test` - [ ] No circular dependency errors ## 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