Skip to content

Commit 634a441

Browse files
authored
Merge pull request #139 from koenbeuk/issue-128
Fix for internally registered triggers with a Scoped lifetime
2 parents 33e2c24 + ba2d5a0 commit 634a441

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

src/EntityFrameworkCore.Triggered/Infrastructure/Internal/TriggersOptionExtension.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ public void ApplyServices(IServiceCollection services)
239239

240240
var triggerTypeImplementationFactoryType = typeof(ITriggerInstanceFactory<>).MakeGenericType(triggerTypeImplementation);
241241
services.Add(new ServiceDescriptor(triggerTypeImplementationFactoryType, _ => triggerInstanceFactoryBuilder(triggerServiceInstance), lifetime));
242+
services.AddScoped(typeof(IResettableService), serviceProvider => serviceProvider.GetRequiredService(triggerTypeImplementationFactoryType));
242243
}
243244
}
244245
}

src/EntityFrameworkCore.Triggered/Internal/ApplicationTriggerServiceProviderAccessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public ApplicationTriggerServiceProviderAccessor(IServiceProvider internalServic
3737

3838
public void SetTriggerServiceProvider(IServiceProvider serviceProvider)
3939
{
40-
if (_applicationScopedServiceProvider != null)
40+
if (_applicationScopedServiceProvider is not null && _applicationScopedServiceProvider != serviceProvider)
4141
{
4242
throw new InvalidOperationException("Can only set applicationScopedServiceProvider once");
4343
}

src/EntityFrameworkCore.Triggered/Internal/TriggerInstanceFactory.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Microsoft.EntityFrameworkCore.Infrastructure;
25
using Microsoft.Extensions.DependencyInjection;
36

47
namespace EntityFrameworkCore.Triggered.Internal
@@ -9,7 +12,7 @@ public interface ITriggerInstanceFactory
912
object Create(IServiceProvider serviceProvider);
1013
}
1114

12-
public interface ITriggerInstanceFactory<out TTriggerType> : ITriggerInstanceFactory
15+
public interface ITriggerInstanceFactory<out TTriggerType> : ITriggerInstanceFactory, IResettableService
1316
{
1417

1518
}
@@ -40,5 +43,16 @@ public object Create(IServiceProvider serviceProvider)
4043
_instance = _internalFactory(serviceProvider, null);
4144
return _instance;
4245
}
46+
47+
public void ResetState()
48+
{
49+
_instance = null;
50+
}
51+
52+
public Task ResetStateAsync(CancellationToken cancellationToken = default)
53+
{
54+
ResetState();
55+
return Task.CompletedTask;
56+
}
4357
}
4458
}

test/EntityFrameworkCore.Triggered.Tests/Infrastructure/ServiceCollectionExtensionsTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,26 @@ public void AddTriggeredDbContextPool_ReusesScopedServiceProvider()
124124
Assert.Equal(1, triggerStub.BeforeSaveInvocations.Count);
125125
}
126126

127+
[Fact]
128+
public void AddTriggeredDbContextPool_SupportsAScopedLifetime()
129+
{
130+
var subject = new ServiceCollection();
131+
subject.AddTriggeredDbContextPool<TestDbContext>(options => {
132+
options.UseInMemoryDatabase("test");
133+
options.ConfigureWarnings(warningOptions => {
134+
warningOptions.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning);
135+
});
136+
});
137+
138+
var serviceProvider = subject.BuildServiceProvider();
139+
140+
using var scope = serviceProvider.CreateScope();
141+
142+
var context1 = scope.ServiceProvider.GetRequiredService<TestDbContext>();
143+
var context2 = scope.ServiceProvider.GetRequiredService<TestDbContext>();
144+
145+
Assert.Equal(context1, context1);
146+
}
127147

128148
#if EFCORETRIGGERED2 || EFCORETRIGGERED3
129149
[Fact]

0 commit comments

Comments
 (0)