@@ -46,44 +46,45 @@ public static IServiceCollection AddDataLoader<T>(
46
46
services . TryAddScoped < T > ( sp => sp . GetDataLoader < T > ( ) ) ;
47
47
return services ;
48
48
}
49
-
49
+
50
50
public static IServiceCollection TryAddDataLoaderCore (
51
51
this IServiceCollection services )
52
52
{
53
- services . TryAddScoped < IDataLoaderScope , DefaultDataLoaderScope > ( ) ;
54
- services . TryAddScoped < IBatchScheduler , AutoBatchScheduler > ( ) ;
55
-
56
- services . TryAddSingleton ( sp => TaskCachePool . Create ( sp . GetRequiredService < ObjectPoolProvider > ( ) ) ) ;
57
- services . TryAddScoped ( sp => new TaskCacheOwner ( sp . GetRequiredService < ObjectPool < TaskCache > > ( ) ) ) ;
58
-
59
- services . TryAddSingleton < IDataLoaderDiagnosticEvents > (
60
- sp =>
61
- {
62
- var listeners = sp . GetServices < IDataLoaderDiagnosticEventListener > ( ) . ToArray ( ) ;
63
-
64
- return listeners . Length switch
65
- {
66
- 0 => new DataLoaderDiagnosticEventListener ( ) ,
67
- 1 => listeners [ 0 ] ,
68
- _ => new AggregateDataLoaderDiagnosticEventListener ( listeners ) ,
69
- } ;
70
- } ) ;
71
-
72
- services . TryAddScoped (
73
- sp =>
74
- {
75
- var cacheOwner = sp . GetRequiredService < TaskCacheOwner > ( ) ;
76
-
77
- return new DataLoaderOptions
78
- {
79
- Cache = cacheOwner . Cache ,
80
- CancellationToken = cacheOwner . CancellationToken ,
81
- DiagnosticEvents = sp . GetService < IDataLoaderDiagnosticEvents > ( ) ,
82
- MaxBatchSize = 1024 ,
83
- } ;
84
- } ) ;
85
-
86
- return services ;
53
+ services . AddSingleton < DataLoaderScopeFactory > ( ) ;
54
+ services . TryAddScoped < IDataLoaderScope > ( sp => sp . GetRequiredService < DataLoaderScopeFactory > ( ) . CreateScope ( sp ) ) ;
55
+ services . TryAddScoped < IBatchScheduler , AutoBatchScheduler > ( ) ;
56
+
57
+ services . TryAddSingleton ( sp => TaskCachePool . Create ( sp . GetRequiredService < ObjectPoolProvider > ( ) ) ) ;
58
+ services . TryAddScoped ( sp => new TaskCacheOwner ( sp . GetRequiredService < ObjectPool < TaskCache > > ( ) ) ) ;
59
+
60
+ services . TryAddSingleton < IDataLoaderDiagnosticEvents > (
61
+ sp =>
62
+ {
63
+ var listeners = sp . GetServices < IDataLoaderDiagnosticEventListener > ( ) . ToArray ( ) ;
64
+
65
+ return listeners . Length switch
66
+ {
67
+ 0 => new DataLoaderDiagnosticEventListener ( ) ,
68
+ 1 => listeners [ 0 ] ,
69
+ _ => new AggregateDataLoaderDiagnosticEventListener ( listeners ) ,
70
+ } ;
71
+ } ) ;
72
+
73
+ services . TryAddScoped (
74
+ sp =>
75
+ {
76
+ var cacheOwner = sp . GetRequiredService < TaskCacheOwner > ( ) ;
77
+
78
+ return new DataLoaderOptions
79
+ {
80
+ Cache = cacheOwner . Cache ,
81
+ CancellationToken = cacheOwner . CancellationToken ,
82
+ DiagnosticEvents = sp . GetService < IDataLoaderDiagnosticEvents > ( ) ,
83
+ MaxBatchSize = 1024 ,
84
+ } ;
85
+ } ) ;
86
+
87
+ return services ;
87
88
}
88
89
}
89
90
@@ -93,6 +94,25 @@ public static T GetDataLoader<T>(this IServiceProvider services) where T : IData
93
94
=> services . GetRequiredService < IDataLoaderScope > ( ) . GetDataLoader < T > ( ) ;
94
95
}
95
96
97
+ internal sealed class DataLoaderScopeFactory
98
+ {
99
+ #if NET8_0_OR_GREATER
100
+ private readonly FrozenDictionary < Type , DataLoaderRegistration > _registrations ;
101
+ #else
102
+ private readonly Dictionary < Type , DataLoaderRegistration > _registrations ;
103
+ #endif
104
+
105
+ public DataLoaderScopeFactory ( IEnumerable < DataLoaderRegistration > dataLoaderRegistrations )
106
+ #if NET8_0_OR_GREATER
107
+ => _registrations = dataLoaderRegistrations . ToFrozenDictionary ( t => t . ServiceType ) ;
108
+ #else
109
+ => _registrations = dataLoaderRegistrations . ToDictionary ( t => t . ServiceType ) ;
110
+ #endif
111
+
112
+ public IDataLoaderScope CreateScope ( IServiceProvider scopedServiceProvider )
113
+ => new DefaultDataLoaderScope ( scopedServiceProvider , _registrations ) ;
114
+ }
115
+
96
116
file sealed class DefaultDataLoaderScope (
97
117
IServiceProvider serviceProvider ,
98
118
#if NET8_0_OR_GREATER
0 commit comments