Skip to content

Commit 1998396

Browse files
committed
AddAssemblyTriggers now ignores Abstract classes
1 parent 90231ac commit 1998396

6 files changed

Lines changed: 66 additions & 2 deletions

File tree

src/EntityFrameworkCore.Triggered.Extensions/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public static IServiceCollection AddAssemblyTriggers(this IServiceCollection ser
7676

7777
var assemblyTypes = assemblies
7878
.SelectMany(x => x.GetTypes())
79-
.Where(x => x.IsClass);
79+
.Where(x => x.IsClass)
80+
.Where(x => !x.IsAbstract);
8081

8182
foreach (var assemblyType in assemblyTypes)
8283
{

src/EntityFrameworkCore.Triggered.Extensions/TriggersContextOptionsBuilderExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public static TriggersContextOptionsBuilder AddAssemblyTriggers(this TriggersCon
2626

2727
var assemblyTypes = assemblies
2828
.SelectMany(x => x.GetTypes())
29-
.Where(x => x.IsClass);
29+
.Where(x => x.IsClass)
30+
.Where(x => !x.IsAbstract);
3031

3132
foreach (var assemblyType in assemblyTypes)
3233
{
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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+
8+
namespace EntityFrameworkCore.Triggered.Extensions.Tests
9+
{
10+
public abstract class AbstractTrigger : IBeforeSaveTrigger<object>
11+
{
12+
public Task BeforeSave(ITriggerContext<object> context, CancellationToken cancellationToken) => throw new NotImplementedException();
13+
}
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// This file is used by Code Analysis to maintain SuppressMessage
2+
// attributes that are applied to this project.
3+
// Project-level suppressions either have no target or are given
4+
// a specific target and scoped to a namespace, type, member, etc.
5+
6+
using System.Diagnostics.CodeAnalysis;
7+
8+
[assembly: SuppressMessage("Usage", "EF1001:Internal EF Core API usage.", Justification = "<Pending>", Scope = "member", Target = "~M:EntityFrameworkCore.Triggered.Extensions.Tests.TriggerContextOptionsBuilderExtensionsTests.AddAssemblyTriggers_AbstractTrigger_GetsIgnored")]

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,15 @@ public Task SaveChanges_ExplicitlyAddedTriggerThroughDI_RaisesAllTriggerTypes()
127127
[Fact]
128128
public Task SaveChanges_DiscoveredTriggerThroughDI_RaisesAllTriggerTypes()
129129
=> SaveChanges_TriggeredAddedThroughDI_Template(x => x.AddAssemblyTriggers());
130+
131+
[Fact]
132+
public void AddAssemblyTriggers_AbstractTrigger_GetsIgnored()
133+
{
134+
var serviceCollection = new ServiceCollection()
135+
.AddAssemblyTriggers();
136+
137+
// Ensure that we did not register the AbstractTrigger
138+
Assert.Empty(serviceCollection.Where(x => x.ImplementationType == typeof(AbstractTrigger)));
139+
}
130140
}
131141
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using EntityFrameworkCore.Triggered.Infrastructure;
7+
using EntityFrameworkCore.Triggered.Infrastructure.Internal;
8+
using Microsoft.EntityFrameworkCore;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Xunit;
11+
12+
namespace EntityFrameworkCore.Triggered.Extensions.Tests
13+
{
14+
public class TriggerContextOptionsBuilderExtensionsTests
15+
{
16+
[Fact]
17+
public void AddAssemblyTriggers_AbstractTrigger_GetsIgnored()
18+
{
19+
var context = new DbContextOptionsBuilder();
20+
var builder = new TriggersContextOptionsBuilder(context);
21+
22+
builder.AddAssemblyTriggers();
23+
24+
var triggerOptionExtension = context.Options.Extensions.OfType<TriggersOptionExtension>().Single();
25+
26+
// Ensure that we did not register the AbstractTrigger
27+
Assert.Empty(triggerOptionExtension.Triggers.Where(x => ReferenceEquals(x.typeOrInstance, typeof(AbstractTrigger))));
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)