Skip to content

Commit 7ad25f8

Browse files
committed
Cache instance factory types
1 parent 2ac490e commit 7ad25f8

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/EntityFrameworkCore.Triggered/Internal/TriggerFactory.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Concurrent;
23
using System.Collections.Generic;
34
using System.Diagnostics;
45
using System.Linq;
@@ -10,6 +11,7 @@ namespace EntityFrameworkCore.Triggered.Internal
1011
{
1112
public sealed class TriggerFactory
1213
{
14+
static readonly ConcurrentDictionary<Type, Type> _instanceFactoryTypeCache = new();
1315
readonly IServiceProvider _internalServiceProvider;
1416

1517
public TriggerFactory(IServiceProvider internalServiceProvider)
@@ -30,12 +32,19 @@ public IEnumerable<object> Resolve(IServiceProvider serviceProvider, Type trigge
3032
}
3133

3234
// Alternatively, triggers may be registered with the extension configuration
33-
var triggerServiceFactories = _internalServiceProvider.GetServices(typeof(ITriggerInstanceFactory<>).MakeGenericType(triggerType)).Cast<ITriggerInstanceFactory>();
35+
var instanceFactoryType = _instanceFactoryTypeCache.GetOrAdd(triggerType,
36+
triggerType => typeof(ITriggerInstanceFactory<>).MakeGenericType(triggerType)
37+
);
38+
39+
var triggerServiceFactories = _internalServiceProvider.GetServices(instanceFactoryType);
3440
if (triggerServiceFactories.Any())
3541
{
3642
foreach (var triggerServiceFactory in triggerServiceFactories)
3743
{
38-
yield return triggerServiceFactory.Create(serviceProvider);
44+
if (triggerServiceFactory is not null)
45+
{
46+
yield return ((ITriggerInstanceFactory)triggerServiceFactory).Create(serviceProvider);
47+
}
3948
}
4049
}
4150
}

0 commit comments

Comments
 (0)