Skip to content

Commit 26bf2cd

Browse files
committed
2 parents aa7c24a + c1ec53c commit 26bf2cd

File tree

7 files changed

+58
-15
lines changed

7 files changed

+58
-15
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public DbContextOptionsExtensionInfo Info
134134

135135
public void ApplyServices(IServiceCollection services)
136136
{
137-
services.AddScoped(serviceProvider => new ApplicationTriggerServiceProviderAccessor(serviceProvider, _serviceProviderTransform, serviceProvider.GetService<ILogger<ApplicationTriggerServiceProviderAccessor>>()));
137+
services.AddScoped(serviceProvider => new ApplicationTriggerServiceProviderAccessor(serviceProvider, _serviceProviderTransform));
138138
services.AddScoped<IResettableService>(serviceProvider => serviceProvider.GetRequiredService<ApplicationTriggerServiceProviderAccessor>());
139139
services.TryAddScoped<ITriggerServiceProviderAccessor>(serviceProvider => serviceProvider.GetRequiredService<ApplicationTriggerServiceProviderAccessor>());
140140

src/EntityFrameworkCore.Triggered/Internal/ApplicationTriggerServiceProviderAccessor.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Threading;
33
using System.Threading.Tasks;
4+
using Microsoft.EntityFrameworkCore;
45
using Microsoft.EntityFrameworkCore.Diagnostics;
56
using Microsoft.EntityFrameworkCore.Infrastructure;
67
using Microsoft.Extensions.DependencyInjection;
@@ -13,12 +14,11 @@ public sealed class ApplicationTriggerServiceProviderAccessor : ITriggerServiceP
1314
readonly IServiceProvider _internalServiceProvider;
1415
readonly IServiceProvider? _fallbackApplicationServiceProvider;
1516
readonly Func<IServiceProvider, IServiceProvider>? _scopedServiceProviderTransform;
16-
readonly ILogger? _logger;
1717

1818
IServiceScope? _serviceScope;
1919
IServiceProvider? _applicationScopedServiceProvider;
2020

21-
public ApplicationTriggerServiceProviderAccessor(IServiceProvider internalServiceProvider, Func<IServiceProvider, IServiceProvider>? scopedServiceProviderTransform, ILogger? logger)
21+
public ApplicationTriggerServiceProviderAccessor(IServiceProvider internalServiceProvider, Func<IServiceProvider, IServiceProvider>? scopedServiceProviderTransform)
2222
{
2323
if (internalServiceProvider is null)
2424
{
@@ -35,7 +35,6 @@ public ApplicationTriggerServiceProviderAccessor(IServiceProvider internalServic
3535
}
3636

3737
_scopedServiceProviderTransform = scopedServiceProviderTransform;
38-
_logger = logger;
3938
}
4039

4140
public void SetTriggerServiceProvider(IServiceProvider serviceProvider)
@@ -67,11 +66,6 @@ public IServiceProvider GetTriggerServiceProvider()
6766
}
6867
else
6968
{
70-
if (_logger != null && _logger.IsEnabled(LogLevel.Warning))
71-
{
72-
_logger.LogWarning("No ServiceProvider is provided to resolve triggers from.");
73-
}
74-
7569
_serviceScope = _internalServiceProvider.CreateScope();
7670
_applicationScopedServiceProvider = _serviceScope.ServiceProvider;
7771
}

src/EntityFrameworkCore.Triggered/Internal/TriggerFactory.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,14 @@ public IEnumerable<object> Resolve(IServiceProvider serviceProvider, Type trigge
3131

3232
// Alternatively, triggers may be registered with the extension configuration
3333
var triggerServiceFactories = _internalServiceProvider.GetServices(typeof(ITriggerInstanceFactory<>).MakeGenericType(triggerType)).Cast<ITriggerInstanceFactory>();
34-
foreach (var triggerServiceFactory in triggerServiceFactories)
34+
if (triggerServiceFactories.Any())
3535
{
36-
yield return triggerServiceFactory.Create(serviceProvider);
36+
var dbContext = _internalServiceProvider.GetService<Microsoft.EntityFrameworkCore.Infrastructure.ICurrentDbContext>()?.Context;
37+
38+
foreach (var triggerServiceFactory in triggerServiceFactories)
39+
{
40+
yield return triggerServiceFactory.Create(dbContext, serviceProvider);
41+
}
3742
}
3843
}
3944
}

src/EntityFrameworkCore.Triggered/Internal/TriggerInstanceFactory.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
using System.Linq;
44
using System.Text;
55
using System.Threading.Tasks;
6+
using Microsoft.EntityFrameworkCore;
67
using Microsoft.Extensions.DependencyInjection;
78

89
namespace EntityFrameworkCore.Triggered.Internal
910
{
1011

1112
public interface ITriggerInstanceFactory
1213
{
13-
object Create(IServiceProvider serviceProvider);
14+
object Create(DbContext? dbContext, IServiceProvider serviceProvider);
1415
}
1516

1617
public interface ITriggerInstanceFactory<out TTriggerType> : ITriggerInstanceFactory
@@ -27,14 +28,16 @@ public TriggerInstanceFactory(object? serviceInstance)
2728
_serviceInstance = serviceInstance;
2829
}
2930

30-
public object Create(IServiceProvider serviceProvider)
31+
public object Create(DbContext? dbContext, IServiceProvider serviceProvider)
3132
{
3233
if (_serviceInstance is not null)
3334
{
3435
return _serviceInstance;
3536
}
3637

37-
return ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider, typeof(TTriggerType));
38+
var arguments = dbContext is not null ? new object[] { dbContext } : Array.Empty<object>();
39+
40+
return ActivatorUtilities.CreateInstance(serviceProvider, typeof(TTriggerType), arguments);
3841
}
3942
}
4043
}

test/EntityFrameworkCore.Triggered.Extensions.Tests/EntityFrameworkCore.Triggered.Extensions.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="Linker.ScenarioTests.XUnit" Version="0.2.2" />
1011
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(EFCorePackageVersion)" />
1112
</ItemGroup>
1213

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void GetTriggerServiceProvider_WithApplicationDiAndTransform_ReturnsCusto
5757

5858
var dbContext = applicationServiceProvider.GetRequiredService<TestDbContext>();
5959

60-
var subject = new ApplicationTriggerServiceProviderAccessor(dbContext.GetInfrastructure(), _ => applicationServiceProvider, new NullLogger<ApplicationTriggerServiceProviderAccessor>());
60+
var subject = new ApplicationTriggerServiceProviderAccessor(dbContext.GetInfrastructure(), _ => applicationServiceProvider);
6161
var triggerServiceProvider = subject.GetTriggerServiceProvider();
6262

6363
Assert.Equal(applicationServiceProvider, triggerServiceProvider);

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
using System.Threading;
77
using System.Threading.Tasks;
88
using EntityFrameworkCore.Triggered.Internal;
9+
using Microsoft.EntityFrameworkCore;
10+
using Microsoft.EntityFrameworkCore.Diagnostics;
911
using Microsoft.EntityFrameworkCore.Infrastructure;
12+
using Microsoft.EntityFrameworkCore.Internal;
1013
using Microsoft.Extensions.DependencyInjection;
1114
using Xunit;
1215
using Xunit.Sdk;
@@ -32,6 +35,31 @@ public SampleTrigger2(TriggerFactory triggerFactory)
3235
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => throw new NotImplementedException();
3336
}
3437

38+
class SampleTrigger3 : IBeforeSaveTrigger<object>
39+
{
40+
public SampleTrigger3(SampleDbContext3 dbContext)
41+
{
42+
DbContext = dbContext;
43+
}
44+
45+
public SampleDbContext3 DbContext { get; }
46+
47+
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => throw new NotImplementedException();
48+
}
49+
50+
public class SampleDbContext3 : DbContext
51+
{
52+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
53+
{
54+
optionsBuilder
55+
.UseInMemoryDatabase(nameof(SampleDbContext3))
56+
.UseTriggers(triggerOptions => triggerOptions.AddTrigger<SampleTrigger3>());
57+
optionsBuilder.ConfigureWarnings(warningOptions => {
58+
warningOptions.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning);
59+
});
60+
}
61+
}
62+
3563
[Fact]
3664
public void Resolve_FromExternalServiceProvider_FindsType()
3765
{
@@ -83,5 +111,17 @@ public void Resolve_FromInternalServices_GetsConstructedUsingExternalServiceProv
83111
Assert.NotNull(trigger);
84112
Assert.Equal(subject, trigger.TriggerFactory);
85113
}
114+
115+
[Fact]
116+
public void Resolve_FromInternalServices_AcceptsTheDbContextAsAnArugmnet()
117+
{
118+
using var dbContext = new SampleDbContext3();
119+
var subject = dbContext.GetService<TriggerFactory>();
120+
121+
var trigger = subject.Resolve(dbContext.GetInfrastructure(), typeof(IBeforeSaveTrigger<object>)).FirstOrDefault() as SampleTrigger3;
122+
123+
Assert.NotNull(trigger);
124+
Assert.Equal(dbContext, trigger.DbContext);
125+
}
86126
}
87127
}

0 commit comments

Comments
 (0)