Skip to content

Commit 55e2374

Browse files
authored
Merge pull request #86 from koenbeuk/cleanup-sp-registration
Removed unneeded complexities
2 parents eee853d + eb6ba01 commit 55e2374

File tree

4 files changed

+37
-64
lines changed

4 files changed

+37
-64
lines changed

src/EntityFrameworkCore.Triggered/Extensions/ServiceCollectionExtensions.cs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,6 @@ namespace Microsoft.Extensions.DependencyInjection
1111
{
1212
public static class ServiceCollectionExtensions
1313
{
14-
private static object CreateContextFactory(IServiceProvider serviceProvider, Type contextType)
15-
{
16-
var instance = ActivatorUtilities.CreateInstance(serviceProvider, contextType);
17-
18-
if (instance is DbContext dbContextInstance)
19-
{
20-
var applicationTriggerServiceProviderAccessor = dbContextInstance.GetService<ApplicationTriggerServiceProviderAccessor>();
21-
if (applicationTriggerServiceProviderAccessor != null)
22-
{
23-
applicationTriggerServiceProviderAccessor.SetTriggerServiceProvider(serviceProvider);
24-
}
25-
}
26-
27-
return instance;
28-
}
29-
3014
private static object SetApplicationTriggerServiceProviderAccessor(object instance, IServiceProvider serviceProvider)
3115
{
3216
if (instance is DbContext dbContext)
@@ -44,11 +28,6 @@ private static object SetApplicationTriggerServiceProviderAccessor(object instan
4428
public static IServiceCollection AddTriggeredDbContext<TContext>(this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder>? optionsAction = null, ServiceLifetime contextLifetime = ServiceLifetime.Scoped, ServiceLifetime optionsLifetime = ServiceLifetime.Scoped)
4529
where TContext : DbContext
4630
{
47-
serviceCollection.TryAdd(ServiceDescriptor.Describe(
48-
serviceType: typeof(TContext),
49-
implementationFactory: serviceProvider => CreateContextFactory(serviceProvider, typeof(TContext)),
50-
lifetime: contextLifetime));
51-
5231
serviceCollection.AddDbContext<TContext>(options => {
5332
optionsAction?.Invoke(options);
5433
options.UseTriggers();
@@ -88,7 +67,6 @@ public static IServiceCollection AddTriggeredDbContextFactory<TContext>(this ISe
8867
}, lifetime);
8968

9069
var serviceDescriptor = serviceCollection.FirstOrDefault(x => x.ServiceType == typeof(IDbContextFactory<TContext>));
91-
9270

9371
if (serviceDescriptor?.ImplementationType != null)
9472
{

src/EntityFrameworkCore.Triggered/Internal/ApplicationTriggerServiceProviderAccessor.cs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ namespace EntityFrameworkCore.Triggered.Internal
1010
{
1111
public sealed class ApplicationTriggerServiceProviderAccessor : ITriggerServiceProviderAccessor, IDisposable, IResettableService
1212
{
13-
readonly IServiceProvider _rootServiceProvider;
13+
readonly IServiceProvider _internalServiceProvider;
14+
readonly IServiceProvider? _fallbackApplicationServiceProvider;
1415
readonly Func<IServiceProvider, IServiceProvider>? _scopedServiceProviderTransform;
1516
readonly ILogger? _logger;
17+
1618
IServiceScope? _serviceScope;
1719
IServiceProvider? _applicationScopedServiceProvider;
1820

@@ -26,7 +28,12 @@ public ApplicationTriggerServiceProviderAccessor(IServiceProvider internalServic
2628
var dbContextOptions = internalServiceProvider.GetRequiredService<IDbContextOptions>();
2729
var coreOptionsExtension = dbContextOptions.FindExtension<CoreOptionsExtension>();
2830

29-
_rootServiceProvider = coreOptionsExtension.ApplicationServiceProvider ?? internalServiceProvider;
31+
_internalServiceProvider = internalServiceProvider;
32+
if (scopedServiceProviderTransform == null)
33+
{
34+
_fallbackApplicationServiceProvider = coreOptionsExtension.ApplicationServiceProvider;
35+
}
36+
3037
_scopedServiceProviderTransform = scopedServiceProviderTransform;
3138
_logger = logger;
3239
}
@@ -45,20 +52,30 @@ public IServiceProvider GetTriggerServiceProvider()
4552
{
4653
if (_applicationScopedServiceProvider == null)
4754
{
48-
if (_scopedServiceProviderTransform == null)
55+
if (_fallbackApplicationServiceProvider != null)
56+
{
57+
_applicationScopedServiceProvider = _fallbackApplicationServiceProvider;
58+
}
59+
else if (_scopedServiceProviderTransform != null)
60+
{
61+
62+
var dbContextOptions = _internalServiceProvider.GetRequiredService<IDbContextOptions>();
63+
var coreOptionsExtension = dbContextOptions.FindExtension<CoreOptionsExtension>();
64+
var serviceProvider = coreOptionsExtension.ApplicationServiceProvider ?? _internalServiceProvider;
65+
66+
_applicationScopedServiceProvider = _scopedServiceProviderTransform(serviceProvider);
67+
}
68+
else
4969
{
5070
if (_logger != null && _logger.IsEnabled(LogLevel.Warning))
5171
{
5272
_logger.LogWarning("No ServiceProvider is provided to resolve triggers from.");
5373
}
5474

55-
_serviceScope = _rootServiceProvider.CreateScope();
75+
_serviceScope = _internalServiceProvider.CreateScope();
5676
_applicationScopedServiceProvider = _serviceScope.ServiceProvider;
5777
}
58-
else
59-
{
60-
_applicationScopedServiceProvider = _scopedServiceProviderTransform(_rootServiceProvider);
61-
}
78+
6279
}
6380

6481
return _applicationScopedServiceProvider;

test/EntityFrameworkCore.Triggered.Tests/Internal/ApplicationTriggerServiceProviderAccessorTests.cs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,32 +51,6 @@ public void GetTriggerServiceProvider_NoApplicationDi_ReturnsScopedInternal()
5151
Assert.NotEqual(scopedObject1, scopedObject2);
5252
}
5353

54-
[Fact]
55-
public void GetTriggerServiceProvider_WithApplicationDi_ReturnsScopedApplication()
56-
{
57-
var applicationServiceProvider = new ServiceCollection()
58-
.AddDbContext<TestDbContext>(options => {
59-
options.UseInMemoryDatabase("Test")
60-
.UseTriggers();
61-
62-
options.EnableServiceProviderCaching(false);
63-
})
64-
.AddScoped<object>()
65-
.BuildServiceProvider();
66-
67-
var dbContext = applicationServiceProvider.GetRequiredService<TestDbContext>();
68-
69-
var subject = new ApplicationTriggerServiceProviderAccessor(dbContext.GetInfrastructure(), null, new NullLogger<ApplicationTriggerServiceProviderAccessor>());
70-
var triggerServiceProvider = subject.GetTriggerServiceProvider();
71-
72-
var scopedObject = triggerServiceProvider.GetService<object>();
73-
Assert.NotNull(scopedObject);
74-
75-
var applicationScopedObject = applicationServiceProvider.GetService<object>();
76-
Assert.NotNull(applicationScopedObject);
77-
Assert.NotEqual(applicationScopedObject, scopedObject);
78-
}
79-
8054
[Fact]
8155
public void GetTriggerServiceProvider_WithApplicationDiAndTransform_ReturnsCustomServiceProvider()
8256
{

test/EntityFrameworkCore.Triggered.Tests/TriggerServiceApplicationDependenciesTests.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,19 @@ public void ScopedTriggers_NoScopedApplicationServiceProvider_ForDbContext_DoesN
3535
.AddScoped<IBeforeSaveTrigger<TestModel>, Stubs.TriggerStub<TestModel>>()
3636
.BuildServiceProvider();
3737

38-
using var serviceScope = applicationServiceProvider.CreateScope();
39-
var dbContext = serviceScope.ServiceProvider.GetRequiredService<TestDbContext>();
40-
41-
dbContext.Add(new TestModel { });
42-
dbContext.SaveChanges();
43-
44-
var triggerStub = serviceScope.ServiceProvider.GetRequiredService<IBeforeSaveTrigger<TestModel>>() as TriggerStub<TestModel>;
38+
void SimulateRequest()
39+
{
40+
using var serviceScope = applicationServiceProvider.CreateScope();
41+
var dbContext = serviceScope.ServiceProvider.GetRequiredService<TestDbContext>();
42+
var triggerStub = serviceScope.ServiceProvider.GetRequiredService<IBeforeSaveTrigger<TestModel>>() as TriggerStub<TestModel>;
43+
Assert.Equal(0, triggerStub.BeforeSaveInvocations.Count);
44+
45+
dbContext.Add(new TestModel { });
46+
dbContext.SaveChanges();
47+
}
4548

46-
Assert.Equal(0, triggerStub.BeforeSaveInvocations.Count);
49+
SimulateRequest();
50+
SimulateRequest();
4751
}
4852

4953
[Fact]

0 commit comments

Comments
 (0)