Skip to content

Commit 633d0b8

Browse files
authored
Fixed GreenDonut standalone DI configuration (#6961)
1 parent 91e1def commit 633d0b8

File tree

2 files changed

+57
-36
lines changed

2 files changed

+57
-36
lines changed

src/GreenDonut/src/Core/DependencyInjection/DataLoaderServiceCollectionExtension.cs

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -46,44 +46,45 @@ public static IServiceCollection AddDataLoader<T>(
4646
services.TryAddScoped<T>(sp => sp.GetDataLoader<T>());
4747
return services;
4848
}
49-
49+
5050
public static IServiceCollection TryAddDataLoaderCore(
5151
this IServiceCollection services)
5252
{
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;
8788
}
8889
}
8990

@@ -93,6 +94,25 @@ public static T GetDataLoader<T>(this IServiceProvider services) where T : IData
9394
=> services.GetRequiredService<IDataLoaderScope>().GetDataLoader<T>();
9495
}
9596

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+
96116
file sealed class DefaultDataLoaderScope(
97117
IServiceProvider serviceProvider,
98118
#if NET8_0_OR_GREATER

src/GreenDonut/src/Core/DependencyInjection/IDataLoaderScope.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ public interface IDataLoaderScope
3232
/// Returns a <see cref="IDataLoader"/> instance from the current execution scope.
3333
/// </returns>
3434
T GetDataLoader<T>() where T : IDataLoader;
35-
}
35+
}
36+

0 commit comments

Comments
 (0)