Skip to content

Commit 5cb461d

Browse files
committed
better service resolution
1 parent 6d1f1e8 commit 5cb461d

File tree

8 files changed

+45
-22
lines changed

8 files changed

+45
-22
lines changed

src/GraphQL.EntityFramework/EfGraphQLConventions.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ public static void RegisterInContainer<TDbContext>(
2828
RegisterScalarsAndArgs(services);
2929
services.AddHttpContextAccessor();
3030
services.AddTransient<HttpContextCapture>();
31-
services.AddSingleton(
32-
provider => Build(resolveDbContext, model, resolveFilters, provider, disableTracking, disableAsync));
33-
services.AddSingleton<IEfGraphQLService<TDbContext>>(
34-
provider => provider.GetRequiredService<EfGraphQLService<TDbContext>>());
31+
services.AddSingleton(provider => Build(resolveDbContext, model, resolveFilters, provider, disableTracking, disableAsync));
32+
services.AddSingleton<IEfGraphQLService<TDbContext>>(provider => provider.GetRequiredService<EfGraphQLService<TDbContext>>());
3533
}
3634

3735
static EfGraphQLService<TDbContext> Build<TDbContext>(
@@ -45,7 +43,7 @@ static EfGraphQLService<TDbContext> Build<TDbContext>(
4543
{
4644
model ??= ResolveModel<TDbContext>(provider);
4745
filters ??= provider.GetService<ResolveFilters<TDbContext>>();
48-
dbContextResolver ??= _ => DbContextFromProvider<TDbContext>(provider);
46+
dbContextResolver ??= (_, requestServices) => DbContextFromProvider<TDbContext>(provider, requestServices);
4947

5048
return new(
5149
model,
@@ -55,9 +53,16 @@ static EfGraphQLService<TDbContext> Build<TDbContext>(
5553
disableAsync);
5654
}
5755

58-
static TDbContext DbContextFromProvider<TDbContext>(IServiceProvider provider)
56+
static TDbContext DbContextFromProvider<TDbContext>(IServiceProvider provider, IServiceProvider? requestServices)
5957
where TDbContext : DbContext
6058
{
59+
var dataFromRequestServices = requestServices?
60+
.GetService<TDbContext>();
61+
if (dataFromRequestServices is not null)
62+
{
63+
return dataFromRequestServices;
64+
}
65+
6166
var dataFromHttpContext = provider.GetService<HttpContextCapture>()?
6267
.HttpContextAccessor
6368
.HttpContext?

src/GraphQL.EntityFramework/GraphApi/EfGraphQLService.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ ResolveEfFieldContext<TDbContext, TSource> BuildContext<TSource>(
6565
User = context.User
6666
};
6767

68-
public TDbContext ResolveDbContext(IResolveFieldContext context) =>
69-
resolveDbContext(context.UserContext);
68+
public TDbContext ResolveDbContext(IResolveFieldContext fieldContext)
69+
{
70+
var userContext = fieldContext.UserContext;
71+
var executionContext = fieldContext.ExecutionContext;
72+
var requestServices = executionContext.RequestServices ?? executionContext.ExecutionOptions.RequestServices;
73+
return resolveDbContext(userContext, requestServices);
74+
}
7075

7176
Filters<TDbContext>? ResolveFilter<TSource>(IResolveFieldContext<TSource> context) =>
7277
resolveFilters?.Invoke(context.UserContext);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
namespace GraphQL.EntityFramework;
22

3-
public delegate TDbContext ResolveDbContext<out TDbContext>(object userContext)
3+
public delegate TDbContext ResolveDbContext<out TDbContext>(object userContext, IServiceProvider? requestServices)
44
where TDbContext : DbContext;

src/Tests/DependencyResolutionTests/DependencyTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public async Task ExplicitModel()
2424
services.AddSingleton<DependencySchema>();
2525
EfGraphQLConventions.RegisterInContainer(
2626
services,
27-
userContext => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext,
27+
(userContext, _) => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext,
2828
sqlInstance.Model);
2929
await using var provider = services.BuildServiceProvider();
3030
using var schema = provider.GetRequiredService<DependencySchema>();
@@ -50,7 +50,7 @@ public async Task ScopedDbContext()
5050

5151
EfGraphQLConventions.RegisterInContainer(
5252
services,
53-
userContext => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
53+
(userContext, _) => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
5454
await using var provider = services.BuildServiceProvider();
5555
using var schema = new DependencySchema(provider);
5656
var executionOptions = new ExecutionOptions
@@ -75,7 +75,7 @@ public async Task TransientDbContext()
7575

7676
EfGraphQLConventions.RegisterInContainer(
7777
services,
78-
userContext => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
78+
(userContext, _) => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
7979
await using var provider = services.BuildServiceProvider();
8080
using var schema = new DependencySchema(provider);
8181
var options = new ExecutionOptions
@@ -100,7 +100,7 @@ public async Task SingletonDbContext()
100100

101101
EfGraphQLConventions.RegisterInContainer(
102102
services,
103-
userContext => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
103+
(userContext, _) => ((UserContextSingleDb<DependencyDbContext>) userContext).DbContext);
104104
await using var provider = services.BuildServiceProvider();
105105
using var schema = new DependencySchema(provider);
106106
var options = new ExecutionOptions

src/Tests/IntegrationTests/IntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task SchemaPrint()
4040
services.AddSingleton(type);
4141
}
4242

43-
EfGraphQLConventions.RegisterInContainer(services, _ => dbContext, dbContext.Model);
43+
EfGraphQLConventions.RegisterInContainer(services, (_, _) => dbContext, dbContext.Model);
4444
await using var provider = services.BuildServiceProvider();
4545
using var schema = new Schema(provider);
4646

src/Tests/IntegrationTests/QueryExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static async Task<string> ExecuteQuery<TDbContext>(
1212
{
1313
EfGraphQLConventions.RegisterInContainer(
1414
services,
15-
_ => data,
15+
(_, _) => data,
1616
data.Model,
1717
_ => filters,
1818
disableTracking,

src/Tests/Mapping/MappingTests.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
public class MappingTests
1+
using ExecutionContext = GraphQL.Execution.ExecutionContext;
2+
3+
public class MappingTests
24
{
35
static SqlInstance<MappingContext> sqlInstance;
46

@@ -43,22 +45,32 @@ public async Task Resolve()
4345
await database.AddDataUntracked(child, parent);
4446
var services = new ServiceCollection();
4547
services.AddSingleton<MappingQuery>();
46-
EfGraphQLConventions.RegisterInContainer(services,_ => database.NewDbContext(), model:sqlInstance.Model);
48+
EfGraphQLConventions.RegisterInContainer(services, (_, _) => database.NewDbContext(), model: sqlInstance.Model);
4749
await using var provider = services.BuildServiceProvider();
4850
var mappingQuery = provider.GetRequiredService<MappingQuery>();
4951

52+
var fieldContext = new ResolveFieldContext
53+
{
54+
ExecutionContext = new ExecutionContext
55+
{
56+
RequestServices = provider
57+
}
58+
};
5059
var resolve = await mappingQuery.Fields
5160
.Single(_ => _.Name == "children")
5261
.Resolver!
53-
.ResolveAsync(new ResolveFieldContext());
62+
.ResolveAsync(fieldContext);
5463
await Verify(resolve);
5564
}
5665

5766
[Fact]
5867
public async Task PropertyToObject()
5968
{
6069
var expression = Mapper<MappingContext>.PropertyToObject<MappingParent>("Property");
61-
var result = expression.Compile()(new() {Property = "value"});
70+
var result = expression.Compile()(new()
71+
{
72+
Property = "value"
73+
});
6274
await Verify(
6375
new
6476
{

src/Tests/MultiContextTests/MultiContextTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ public async Task Run()
5050

5151
EfGraphQLConventions.RegisterInContainer(
5252
services,
53-
userContext => ((UserContext) userContext).DbContext1);
53+
(_, requestServices) => requestServices!.GetRequiredService<DbContext1>());
5454
EfGraphQLConventions.RegisterInContainer(
5555
services,
56-
userContext => ((UserContext) userContext).DbContext2);
56+
(_, requestServices) => requestServices!.GetRequiredService<DbContext2>());
5757

5858
#endregion
5959

@@ -67,7 +67,8 @@ public async Task Run()
6767
{
6868
Schema = schema,
6969
Query = query,
70-
UserContext = new UserContext(dbContext1, dbContext2)
70+
UserContext = new UserContext(dbContext1, dbContext2),
71+
RequestServices = provider,
7172
};
7273

7374
#endregion

0 commit comments

Comments
 (0)