Skip to content

Commit 09211ff

Browse files
danielreynolds1michaelstaib
authored andcommitted
Added "AddDataLoader<TService, TImplementation>" overload that takes a factory (#7674)
1 parent a390e46 commit 09211ff

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

src/GreenDonut/src/Core/DependencyInjection/DataLoaderServiceCollectionExtensions.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ public static IServiceCollection AddDataLoader<T>(
4141
return services;
4242
}
4343

44+
public static IServiceCollection AddDataLoader<TService, TImplementation>(
45+
this IServiceCollection services,
46+
Func<IServiceProvider, TImplementation> factory)
47+
where TService : class, IDataLoader
48+
where TImplementation : class, TService
49+
{
50+
services.TryAddDataLoaderCore();
51+
services.AddSingleton(new DataLoaderRegistration(typeof(TService), typeof(TImplementation), sp => factory(sp)));
52+
services.TryAddScoped<TImplementation>(sp => sp.GetDataLoader<TImplementation>());
53+
services.TryAddScoped<TService>(sp => sp.GetDataLoader<TService>());
54+
return services;
55+
}
56+
4457
public static IServiceCollection TryAddDataLoaderCore(
4558
this IServiceCollection services)
4659
{
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using GreenDonut;
2+
using Xunit;
3+
using static GreenDonut.TestHelpers;
4+
5+
namespace Microsoft.Extensions.DependencyInjection;
6+
7+
public class DataLoaderServiceCollectionExtensionsTests
8+
{
9+
[Fact]
10+
public void ImplFactoryIsCalledWhenServiceIsResolved()
11+
{
12+
// arrange
13+
var factoryCalled = false;
14+
var fetch = CreateFetch<string, string>();
15+
var services = new ServiceCollection()
16+
.AddScoped<IBatchScheduler, ManualBatchScheduler>()
17+
.AddDataLoader(sp =>
18+
{
19+
factoryCalled = true;
20+
return new DataLoader<string, string>(fetch, sp.GetRequiredService<IBatchScheduler>());
21+
});
22+
var scope = services.BuildServiceProvider().CreateScope();
23+
24+
// act
25+
var dataLoader = scope.ServiceProvider.GetRequiredService<DataLoader<string, string>>();
26+
27+
// assert
28+
Assert.NotNull(dataLoader);
29+
Assert.True(factoryCalled);
30+
}
31+
32+
[Fact]
33+
public void InterfaceImplFactoryIsCalledWhenServiceIsResolved()
34+
{
35+
// arrange
36+
var factoryCalled = false;
37+
var fetch = CreateFetch<string, string>();
38+
var services = new ServiceCollection()
39+
.AddScoped<IBatchScheduler, ManualBatchScheduler>()
40+
.AddDataLoader<IDataLoader<string, string>, DataLoader<string, string>>(sp =>
41+
{
42+
factoryCalled = true;
43+
return new DataLoader<string, string>(fetch, sp.GetRequiredService<IBatchScheduler>());
44+
});
45+
var scope = services.BuildServiceProvider().CreateScope();
46+
47+
// act
48+
var dataLoader = scope.ServiceProvider.GetRequiredService<DataLoader<string, string>>();
49+
var asInterface = scope.ServiceProvider.GetRequiredService<IDataLoader<string, string>>();
50+
51+
// assert
52+
Assert.NotNull(dataLoader);
53+
Assert.NotNull(asInterface);
54+
Assert.True(factoryCalled);
55+
}
56+
}

0 commit comments

Comments
 (0)