Skip to content

Commit 1d2cac5

Browse files
committed
2 parents c8a46f9 + 05d1ce3 commit 1d2cac5

File tree

10 files changed

+394
-15
lines changed

10 files changed

+394
-15
lines changed

EntityFrameworkCore.Triggered.Core-v1.slnf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
"src\\EntityFrameworkCore.Triggered.Transactions.Abstractions\\EntityFrameworkCore.Triggered.Transactions.Abstractions.csproj",
88
"src\\EntityFrameworkCore.Triggered.Transactions\\EntityFrameworkCore.Triggered.Transactions.csproj",
99
"src\\EntityFrameworkCore.Triggered\\EntityFrameworkCore.Triggered.csproj",
10+
"src\\EntityFrameworkCore.Triggered.Extensions\\EntityFrameworkCore.Triggered.Extensions.csproj",
1011
"test\\EntityFrameworkCore.Triggered.AspNetCore.Tests\\EntityFrameworkCore.Triggered.AspNetCore.Tests.csproj",
1112
"test\\EntityFrameworkCore.Triggered.Tests\\EntityFrameworkCore.Triggered.Tests.csproj",
12-
"test\\EntityFrameworkCore.Triggered.Transactions.Tests\\EntityFrameworkCore.Triggered.Transactions.Tests.csproj"
13+
"test\\EntityFrameworkCore.Triggered.Transactions.Tests\\EntityFrameworkCore.Triggered.Transactions.Tests.csproj",
14+
"test\\EntityFrameworkCore.Triggered.Extensions.Tests\\EntityFrameworkCore.Triggered.Extensions.Tests.csproj"
1315
]
1416
}
1517
}

EntityFrameworkCore.Triggered.Core.slnf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
"src\\EntityFrameworkCore.Triggered.Transactions.Abstractions\\EntityFrameworkCore.Triggered.Transactions.Abstractions.csproj",
77
"src\\EntityFrameworkCore.Triggered.Transactions\\EntityFrameworkCore.Triggered.Transactions.csproj",
88
"src\\EntityFrameworkCore.Triggered\\EntityFrameworkCore.Triggered.csproj",
9+
"src\\EntityFrameworkCore.Triggered.Extensions\\EntityFrameworkCore.Triggered.Extensions.csproj",
910
"test\\EntityFrameworkCore.Triggered.Tests\\EntityFrameworkCore.Triggered.Tests.csproj",
10-
"test\\EntityFrameworkCore.Triggered.Transactions.Tests\\EntityFrameworkCore.Triggered.Transactions.Tests.csproj"
11+
"test\\EntityFrameworkCore.Triggered.Transactions.Tests\\EntityFrameworkCore.Triggered.Transactions.Tests.csproj",
12+
"test\\EntityFrameworkCore.Triggered.Extensions.Tests\\EntityFrameworkCore.Triggered.Extensions.Tests.csproj"
1113
]
1214
}
1315
}

EntityFrameworkCore.Triggered.sln

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "3 - StudentManagerAspNetCor
5757
EndProject
5858
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "4 - BlazorTests", "samples\v2\4 - BlazorTests\4 - BlazorTests.csproj", "{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}"
5959
EndProject
60+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkCore.Triggered.Extensions", "src\EntityFrameworkCore.Triggered.Extensions\EntityFrameworkCore.Triggered.Extensions.csproj", "{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}"
61+
EndProject
62+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntityFrameworkCore.Triggered.Extensions.Tests", "test\EntityFrameworkCore.Triggered.Extensions.Tests\EntityFrameworkCore.Triggered.Extensions.Tests.csproj", "{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}"
63+
EndProject
6064
Global
6165
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6266
Debug|Any CPU = Debug|Any CPU
@@ -135,48 +139,64 @@ Global
135139
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
136140
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
137141
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.Release|Any CPU.Build.0 = Release|Any CPU
138-
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
139-
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
142+
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
143+
{EC814B59-B387-4092-8F6B-6BDA4390AA9C}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
140144
{F93BA841-B47A-440E-82D9-FD65C278915F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
141145
{F93BA841-B47A-440E-82D9-FD65C278915F}.Debug|Any CPU.Build.0 = Debug|Any CPU
142146
{F93BA841-B47A-440E-82D9-FD65C278915F}.DebugV1|Any CPU.ActiveCfg = Debug|Any CPU
143147
{F93BA841-B47A-440E-82D9-FD65C278915F}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
144148
{F93BA841-B47A-440E-82D9-FD65C278915F}.Release|Any CPU.ActiveCfg = Release|Any CPU
145149
{F93BA841-B47A-440E-82D9-FD65C278915F}.Release|Any CPU.Build.0 = Release|Any CPU
146-
{F93BA841-B47A-440E-82D9-FD65C278915F}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
147-
{F93BA841-B47A-440E-82D9-FD65C278915F}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
150+
{F93BA841-B47A-440E-82D9-FD65C278915F}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
151+
{F93BA841-B47A-440E-82D9-FD65C278915F}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
148152
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
149153
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
150154
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.DebugV1|Any CPU.ActiveCfg = Debug|Any CPU
151155
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
152156
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
153157
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.Release|Any CPU.Build.0 = Release|Any CPU
154-
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
155-
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
158+
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
159+
{A5F5FFA0-495C-4AE9-B50B-6646F77F08BE}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
156160
{D5444C85-1852-4F79-972E-580E7F1E226B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
157161
{D5444C85-1852-4F79-972E-580E7F1E226B}.Debug|Any CPU.Build.0 = Debug|Any CPU
158162
{D5444C85-1852-4F79-972E-580E7F1E226B}.DebugV1|Any CPU.ActiveCfg = Debug|Any CPU
159163
{D5444C85-1852-4F79-972E-580E7F1E226B}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
160164
{D5444C85-1852-4F79-972E-580E7F1E226B}.Release|Any CPU.ActiveCfg = Release|Any CPU
161165
{D5444C85-1852-4F79-972E-580E7F1E226B}.Release|Any CPU.Build.0 = Release|Any CPU
162-
{D5444C85-1852-4F79-972E-580E7F1E226B}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
163-
{D5444C85-1852-4F79-972E-580E7F1E226B}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
166+
{D5444C85-1852-4F79-972E-580E7F1E226B}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
167+
{D5444C85-1852-4F79-972E-580E7F1E226B}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
164168
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
165169
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.Debug|Any CPU.Build.0 = Debug|Any CPU
166170
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.DebugV1|Any CPU.ActiveCfg = Debug|Any CPU
167171
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
168172
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.Release|Any CPU.ActiveCfg = Release|Any CPU
169173
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.Release|Any CPU.Build.0 = Release|Any CPU
170-
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
171-
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
174+
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
175+
{8C93D4CA-4F66-4A19-9CF5-87A227324896}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
172176
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
173177
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
174178
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.DebugV1|Any CPU.ActiveCfg = Debug|Any CPU
175179
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.DebugV1|Any CPU.Build.0 = Debug|Any CPU
176180
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
177181
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.Release|Any CPU.Build.0 = Release|Any CPU
178-
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.ReleaseV1|Any CPU.ActiveCfg = Release|Any CPU
179-
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.ReleaseV1|Any CPU.Build.0 = Release|Any CPU
182+
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
183+
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
184+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
185+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
186+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.DebugV1|Any CPU.ActiveCfg = DebugV1|Any CPU
187+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.DebugV1|Any CPU.Build.0 = DebugV1|Any CPU
188+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
189+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.Release|Any CPU.Build.0 = Release|Any CPU
190+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
191+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
192+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
193+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.Debug|Any CPU.Build.0 = Debug|Any CPU
194+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.DebugV1|Any CPU.ActiveCfg = DebugV1|Any CPU
195+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.DebugV1|Any CPU.Build.0 = DebugV1|Any CPU
196+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.Release|Any CPU.ActiveCfg = Release|Any CPU
197+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.Release|Any CPU.Build.0 = Release|Any CPU
198+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.ReleaseV1|Any CPU.ActiveCfg = ReleaseV1|Any CPU
199+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B}.ReleaseV1|Any CPU.Build.0 = ReleaseV1|Any CPU
180200
EndGlobalSection
181201
GlobalSection(SolutionProperties) = preSolution
182202
HideSolutionNode = FALSE
@@ -198,6 +218,8 @@ Global
198218
{D5444C85-1852-4F79-972E-580E7F1E226B} = {E24FAD52-9971-489B-AED1-1D977E545DD4}
199219
{8C93D4CA-4F66-4A19-9CF5-87A227324896} = {E24FAD52-9971-489B-AED1-1D977E545DD4}
200220
{513E2D7F-628C-49DB-A7ED-15A9CCF27E6A} = {E24FAD52-9971-489B-AED1-1D977E545DD4}
221+
{27A4A75B-112E-4B3E-867A-5F0D27F74CF8} = {EDFABD48-3C79-47AE-B84C-47CE2A52C20D}
222+
{57F94F2C-81C4-4304-8F5A-FD4F17A2698B} = {0FAE4F6A-93BB-453C-8FB4-B24A9F30DA59}
201223
EndGlobalSection
202224
GlobalSection(ExtensibilityGlobals) = postSolution
203225
SolutionGuid = {847A0017-23D6-4513-B78E-CAADBD836A7D}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<ItemGroup>
3+
<ProjectReference Include="..\EntityFrameworkCore.Triggered\EntityFrameworkCore.Triggered.csproj" />
4+
</ItemGroup>
5+
</Project>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using System;
2+
using System.Linq;
3+
using System.Reflection;
4+
using EntityFrameworkCore.Triggered;
5+
using EntityFrameworkCore.Triggered.Infrastructure.Internal;
6+
using EntityFrameworkCore.Triggered.Lifecycles;
7+
using Microsoft.Extensions.DependencyInjection.Extensions;
8+
9+
namespace Microsoft.Extensions.DependencyInjection
10+
{
11+
public static class ServiceCollectionExtensions
12+
{
13+
static readonly Type[] _triggerTypes = new Type[] {
14+
typeof(IBeforeSaveTrigger<>),
15+
typeof(IAfterSaveTrigger<>),
16+
typeof(IAfterSaveFailedTrigger<>),
17+
typeof(IBeforeSaveStartingTrigger),
18+
typeof(IBeforeSaveCompletedTrigger),
19+
typeof(IAfterSaveFailedStartingTrigger),
20+
typeof(IAfterSaveFailedCompletedTrigger),
21+
typeof(IAfterSaveStartingTrigger),
22+
typeof(IAfterSaveCompletedTrigger)
23+
};
24+
25+
static void RegisterTriggerTypes(Type triggerImplementationType, IServiceCollection services)
26+
{
27+
foreach (var customTriggerType in _triggerTypes)
28+
{
29+
var customTriggers = customTriggerType.IsGenericTypeDefinition
30+
#pragma warning disable EF1001 // Internal EF Core API usage.
31+
? TypeHelpers.FindGenericInterfaces(triggerImplementationType, customTriggerType)
32+
#pragma warning restore EF1001 // Internal EF Core API usage.
33+
: triggerImplementationType.GetInterfaces().Where(x => x == customTriggerType);
34+
35+
foreach (var customTrigger in customTriggers)
36+
{
37+
services.TryAdd(new ServiceDescriptor(customTrigger, sp => sp.GetService(triggerImplementationType), ServiceLifetime.Transient)); ;
38+
}
39+
}
40+
}
41+
42+
public static IServiceCollection AddTrigger<TTrigger>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped)
43+
where TTrigger : class
44+
{
45+
services.Add(new ServiceDescriptor(typeof(TTrigger), typeof(TTrigger), lifetime));
46+
47+
RegisterTriggerTypes(typeof(TTrigger), services);
48+
49+
return services;
50+
}
51+
52+
public static IServiceCollection AddTrigger(this IServiceCollection services, object triggerInstance)
53+
{
54+
services.AddSingleton(triggerInstance);
55+
56+
RegisterTriggerTypes(triggerInstance.GetType(), services);
57+
58+
return services;
59+
}
60+
61+
public static IServiceCollection AddAssemblyTriggers(this IServiceCollection services)
62+
=> AddAssemblyTriggers(services, Assembly.GetCallingAssembly());
63+
64+
public static IServiceCollection AddAssemblyTriggers(this IServiceCollection services, ServiceLifetime lifetime)
65+
=> AddAssemblyTriggers(services, lifetime, Assembly.GetCallingAssembly());
66+
67+
public static IServiceCollection AddAssemblyTriggers(this IServiceCollection services, params Assembly[] assemblies)
68+
=> AddAssemblyTriggers(services, ServiceLifetime.Scoped, assemblies);
69+
70+
public static IServiceCollection AddAssemblyTriggers(this IServiceCollection services, ServiceLifetime lifetime, params Assembly[] assemblies)
71+
{
72+
if (assemblies is null)
73+
{
74+
throw new ArgumentNullException(nameof(assemblies));
75+
}
76+
77+
var assemblyTypes = assemblies
78+
.SelectMany(x => x.GetTypes())
79+
.Where(x => x.IsClass);
80+
81+
foreach (var assemblyType in assemblyTypes)
82+
{
83+
var triggerTypes = assemblyType
84+
.GetInterfaces()
85+
.Where(x => _triggerTypes.Contains(x.IsConstructedGenericType ? x.GetGenericTypeDefinition() : x));
86+
87+
var registered = false;
88+
89+
foreach (var triggerType in triggerTypes)
90+
{
91+
if (!registered)
92+
{
93+
services.Add(new ServiceDescriptor(assemblyType, assemblyType, lifetime));
94+
95+
registered = true;
96+
}
97+
98+
services.TryAdd(new ServiceDescriptor(triggerType, sp => sp.GetService(assemblyType), ServiceLifetime.Transient));
99+
}
100+
}
101+
102+
return services;
103+
}
104+
}
105+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.ComponentModel.Design;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace EntityFrameworkCore.Triggered.Extensions
10+
{
11+
public class Trigger<TEntity> :
12+
IBeforeSaveTrigger<TEntity>,
13+
IAfterSaveTrigger<TEntity>,
14+
IAfterSaveFailedTrigger<TEntity>
15+
16+
where TEntity : class
17+
{
18+
public virtual void BeforeSave(ITriggerContext<TEntity> context) { }
19+
public virtual void AfterSave(ITriggerContext<TEntity> context) { }
20+
public virtual void AfterSaveFailed(ITriggerContext<TEntity> context, Exception exception) { }
21+
22+
public virtual Task BeforeSave(ITriggerContext<TEntity> context, CancellationToken cancellationToken) => Task.CompletedTask;
23+
public virtual Task AfterSave(ITriggerContext<TEntity> context, CancellationToken cancellationToken) => Task.CompletedTask;
24+
public virtual Task AfterSaveFailed(ITriggerContext<TEntity> context, Exception exception, CancellationToken cancellationToken) => Task.CompletedTask;
25+
26+
Task IBeforeSaveTrigger<TEntity>.BeforeSave(ITriggerContext<TEntity> context, CancellationToken cancellationToken)
27+
{
28+
BeforeSave(context);
29+
return BeforeSave(context, cancellationToken);
30+
}
31+
32+
Task IAfterSaveTrigger<TEntity>.AfterSave(ITriggerContext<TEntity> context, CancellationToken cancellationToken)
33+
{
34+
AfterSave(context);
35+
return AfterSave(context, cancellationToken);
36+
}
37+
38+
Task IAfterSaveFailedTrigger<TEntity>.AfterSaveFailed(ITriggerContext<TEntity> context, Exception exception, CancellationToken cancellationToken)
39+
{
40+
AfterSaveFailed(context, exception);
41+
return AfterSaveFailed(context, exception, cancellationToken);
42+
}
43+
}
44+
}

src/EntityFrameworkCore.Triggered/Extensions/TriggersDbContextOptionsExtensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ namespace Microsoft.EntityFrameworkCore
1111
/// </summary>
1212
public static class TriggersDbContextOptionsExtensions
1313
{
14-
1514
public static DbContextOptionsBuilder<TContext> UseTriggers<TContext>(this DbContextOptionsBuilder<TContext> optionsBuilder, Action<TriggersContextOptionsBuilder>? configure = null)
1615
where TContext : DbContext => (DbContextOptionsBuilder<TContext>)UseTriggers((DbContextOptionsBuilder)optionsBuilder, configure);
1716

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net5.0</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
<Nullable>disable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(EFCorePackageVersion)" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
15+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
16+
<PackageReference Include="xunit" Version="2.4.1" />
17+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
18+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
19+
<PrivateAssets>all</PrivateAssets>
20+
</PackageReference>
21+
<PackageReference Include="coverlet.collector" Version="1.3.0">
22+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
23+
<PrivateAssets>all</PrivateAssets>
24+
</PackageReference>
25+
</ItemGroup>
26+
27+
<ItemGroup>
28+
<ProjectReference Include="..\..\src\EntityFrameworkCore.Triggered.Extensions\EntityFrameworkCore.Triggered.Extensions.csproj" />
29+
</ItemGroup>
30+
31+
</Project>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using EntityFrameworkCore.Triggered.Lifecycles;
8+
9+
namespace EntityFrameworkCore.Triggered.Extensions.Tests
10+
{
11+
public class SampleTrigger : Trigger<object>, IBeforeSaveStartingTrigger
12+
{
13+
public int BeforeSaveCalls;
14+
public int BeforeSaveAsyncCalls;
15+
16+
public int AfterSaveCalls;
17+
public int AfterSaveAsyncCalls;
18+
19+
public int AfterSaveFailedCalls;
20+
public int AfterSaveFailedAsyncCalls;
21+
22+
public int BeforeSaveStartingTriggerCalls;
23+
24+
25+
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
26+
public override void BeforeSave(ITriggerContext<object> context) => BeforeSaveCalls += 1;
27+
public override async Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => BeforeSaveAsyncCalls += 1;
28+
29+
public override void AfterSave(ITriggerContext<object> context) => AfterSaveCalls += 1;
30+
public override async Task AfterSave(ITriggerContext<object> context, CancellationToken cancellationToken) => AfterSaveAsyncCalls += 1;
31+
32+
public override void AfterSaveFailed(ITriggerContext<object> context, Exception exception) => AfterSaveFailedCalls += 1;
33+
public override async Task AfterSaveFailed(ITriggerContext<object> context, Exception exception, CancellationToken cancellationToken) => AfterSaveFailedAsyncCalls += 1;
34+
public async Task BeforeSaveStarting(CancellationToken cancellationToken) => BeforeSaveStartingTriggerCalls += 1;
35+
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
36+
}
37+
}

0 commit comments

Comments
 (0)