Skip to content

Commit d269cfc

Browse files
committed
fix: add context and scope as scoped services in service provider
1 parent 413c1b7 commit d269cfc

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

provider.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,13 +460,13 @@ func (sp *serviceProvider) Close() error {
460460

461461
// addBuiltInServices adds built-in services.
462462
func (sp *serviceProvider) addBuiltInServices() error {
463+
// Register ServiceProvider (existing code)
463464
if err := sp.digContainer.Provide(func() ServiceProvider {
464465
return sp.rootScope
465466
}); err != nil {
466467
return fmt.Errorf("failed to register ServiceProvider: %w", err)
467468
}
468469

469-
// Also add these to our descriptor tracking for IsService checks
470470
spDesc := &serviceDescriptor{
471471
ServiceType: reflect.TypeOf((*ServiceProvider)(nil)).Elem(),
472472
Lifetime: Singleton,
@@ -477,6 +477,28 @@ func (sp *serviceProvider) addBuiltInServices() error {
477477
sp.descriptors = append(sp.descriptors, spDesc)
478478
sp.descriptorIndex[spDesc.ServiceType] = []*serviceDescriptor{spDesc}
479479

480+
// Add context.Context as a scoped service
481+
ctxDesc := &serviceDescriptor{
482+
ServiceType: reflect.TypeOf((*context.Context)(nil)).Elem(),
483+
Lifetime: Scoped, // Important: must be scoped
484+
Constructor: func() context.Context {
485+
return context.Background() // Default, will be overridden in scope
486+
},
487+
}
488+
sp.descriptors = append(sp.descriptors, ctxDesc)
489+
sp.descriptorIndex[ctxDesc.ServiceType] = []*serviceDescriptor{ctxDesc}
490+
491+
// Add Scope as a scoped service
492+
scopeDesc := &serviceDescriptor{
493+
ServiceType: reflect.TypeOf((*Scope)(nil)).Elem(),
494+
Lifetime: Scoped,
495+
Constructor: func() Scope {
496+
return sp.rootScope // Default, will be overridden in scope
497+
},
498+
}
499+
sp.descriptors = append(sp.descriptors, scopeDesc)
500+
sp.descriptorIndex[scopeDesc.ServiceType] = []*serviceDescriptor{scopeDesc}
501+
480502
return nil
481503
}
482504

scope.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,17 @@ func newScope(provider *serviceProvider, ctx context.Context) *serviceProviderSc
115115
}
116116

117117
// Register context in the dig scope
118-
if err := scope.digScope.Provide(func() context.Context { return scope.ctx }); err != nil {
118+
if err := scope.digScope.Decorate(func() context.Context { return scope.ctx }); err != nil {
119119
panic(ErrFailedToCreateScope)
120120
}
121121

122122
// Register the ServiceProvider in the dig scope (override the root registration)
123-
if err := scope.digScope.Provide(func() ServiceProvider { return scope }); err != nil {
123+
if err := scope.digScope.Decorate(func() ServiceProvider { return scope }); err != nil {
124124
panic(fmt.Errorf("failed to register context in dig scope %s: %w", scope.scopeID, err))
125125
}
126126

127127
// Register the Scope in the dig scope
128-
if err := scope.digScope.Provide(func() Scope { return scope }); err != nil {
128+
if err := scope.digScope.Decorate(func() Scope { return scope }); err != nil {
129129
panic(fmt.Errorf("failed to register scope in dig scope %s: %w", scope.scopeID, err))
130130
}
131131

0 commit comments

Comments
 (0)