Skip to content

Commit fa81b8d

Browse files
committed
Add StructureMap, phase2
1 parent fe59d1f commit fa81b8d

15 files changed

+189
-136
lines changed

src/GraphQL.ApiTests/GraphQL.StructureMap.approved.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ namespace GraphQL.StructureMap
1818
{
1919
public static StructureMap.IRegistry AddGraphQL(this StructureMap.IRegistry registry, System.Action<GraphQL.DI.IGraphQLBuilder>? configure) { }
2020
}
21-
public static class RegistryExtensions
21+
public sealed class ServiceProviderAdapter : System.IServiceProvider
2222
{
23-
public static System.IServiceProvider BuildServiceProvider(this StructureMap.Registry registry) { }
23+
public ServiceProviderAdapter(StructureMap.IContainer container) { }
24+
public StructureMap.IContainer Container { get; }
25+
public object GetService(System.Type serviceType) { }
2426
}
2527
}

src/GraphQL.StructureMap/GraphQLBuilder.cs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public GraphQLBuilder(IRegistry registry, Action<IGraphQLBuilder>? configure)
1616
Registry = registry ?? throw new ArgumentNullException(nameof(registry));
1717
configure?.Invoke(this);
1818
RegisterDefaultServices();
19-
// Registry.For<IServiceProvider>(Lifecycles.Container).Use<StructureMapResolver>();
19+
Registry.For<IServiceProvider>(Lifecycles.Container).Use<ServiceProviderAdapter>();
2020
}
2121

2222
private static ILifecycle TranslateLifetime(ServiceLifetime serviceLifetime)
@@ -40,11 +40,11 @@ public IServiceRegister Register(Type serviceType, Type implementationType, Serv
4040
{
4141
if (replace)
4242
{
43-
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).ClearAll().Use(implementationType);
43+
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).ClearAll().Add(implementationType);
4444
}
4545
else
4646
{
47-
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).Use(implementationType);
47+
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).Add(implementationType);
4848
}
4949

5050
return this;
@@ -54,11 +54,11 @@ public IServiceRegister Register(Type serviceType, Func<IServiceProvider, object
5454
{
5555
if (replace)
5656
{
57-
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).ClearAll().Use(context => implementationFactory(context.GetInstance<IServiceProvider>()));
57+
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).ClearAll().Add(context => implementationFactory(context.GetInstance<IServiceProvider>()));
5858
}
5959
else
6060
{
61-
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).Use(context => implementationFactory(context.GetInstance<IServiceProvider>()));
61+
Registry.For(serviceType, TranslateLifetime(serviceLifetime)).Add(context => implementationFactory(context.GetInstance<IServiceProvider>()));
6262
}
6363

6464
return this;
@@ -68,11 +68,11 @@ public IServiceRegister Register(Type serviceType, object implementationInstance
6868
{
6969
if (replace)
7070
{
71-
Registry.For(serviceType, Lifecycles.Singleton).ClearAll().Use(implementationInstance);
71+
Registry.For(serviceType, Lifecycles.Singleton).ClearAll().Add(implementationInstance);
7272
}
7373
else
7474
{
75-
Registry.For(serviceType, Lifecycles.Singleton).Use(implementationInstance);
75+
Registry.For(serviceType, Lifecycles.Singleton).Add(implementationInstance);
7676
}
7777

7878
return this;
@@ -85,14 +85,13 @@ public IServiceRegister TryRegister(Type serviceType, Type implementationType, S
8585
if (implementationType == null)
8686
throw new ArgumentNullException(nameof(implementationType));
8787

88-
//var descriptor = new ServiceDescriptor(serviceType, implementationType, TranslateLifetime(serviceLifetime));
8988
if (mode == RegistrationCompareMode.ServiceType)
9089
{
91-
// ServiceCollection.TryAdd(descriptor);
90+
Register(serviceType, implementationType, serviceLifetime);
9291
}
9392
else if (mode == RegistrationCompareMode.ServiceTypeAndImplementationType)
9493
{
95-
// ServiceCollection.TryAddEnumerable(descriptor);
94+
Register(serviceType, implementationType, serviceLifetime);
9695
}
9796
else
9897
throw new ArgumentOutOfRangeException(nameof(mode));
@@ -107,14 +106,13 @@ public IServiceRegister TryRegister(Type serviceType, Func<IServiceProvider, obj
107106
if (implementationFactory == null)
108107
throw new ArgumentNullException(nameof(implementationFactory));
109108

110-
// var descriptor = new ServiceDescriptor(serviceType, implementationFactory, TranslateLifetime(serviceLifetime));
111109
if (mode == RegistrationCompareMode.ServiceType)
112110
{
113-
// ServiceCollection.TryAdd(descriptor);
111+
Register(serviceType, implementationFactory, serviceLifetime);
114112
}
115113
else if (mode == RegistrationCompareMode.ServiceTypeAndImplementationType)
116114
{
117-
// ServiceCollection.TryAddEnumerable(descriptor);
115+
Register(serviceType, implementationFactory, serviceLifetime);
118116
}
119117
else
120118
throw new ArgumentOutOfRangeException(nameof(mode));
@@ -129,14 +127,13 @@ public IServiceRegister TryRegister(Type serviceType, object implementationInsta
129127
if (implementationInstance == null)
130128
throw new ArgumentNullException(nameof(implementationInstance));
131129

132-
//var descriptor = new ServiceDescriptor(serviceType, implementationInstance);
133130
if (mode == RegistrationCompareMode.ServiceType)
134131
{
135-
// ServiceCollection.TryAdd(descriptor);
132+
Register(serviceType, implementationInstance);
136133
}
137134
else if (mode == RegistrationCompareMode.ServiceTypeAndImplementationType)
138135
{
139-
// ServiceCollection.TryAddEnumerable(descriptor);
136+
Register(serviceType, implementationInstance);
140137
}
141138
else
142139
throw new ArgumentOutOfRangeException(nameof(mode));

src/GraphQL.StructureMap/RegistryExtensions.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using StructureMap;
2+
3+
namespace GraphQL.StructureMap;
4+
5+
public sealed class ServiceProviderAdapter : IServiceProvider
6+
{
7+
public ServiceProviderAdapter(IContainer container)
8+
{
9+
Container = container;
10+
}
11+
12+
public IContainer Container { get; }
13+
14+
public object GetService(Type serviceType) => Container.GetInstance(serviceType);
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
using System.Reflection;
2+
13
namespace GraphQL.Tests.DI;
24

35
internal sealed class DependencyInjectionDataAttribute : ClassDataAttribute
46
{
57
public DependencyInjectionDataAttribute() : base(typeof(DependencyInjectionAdapterData))
68
{
79
}
10+
11+
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
12+
{
13+
return testMethod.DeclaringType.IsDefined(typeof(PrepareDependencyInjectionAttribute))
14+
? base.GetData(testMethod)
15+
: throw new InvalidOperationException("[DependencyInjectionData] attribute should only be used for methods of types marked with [PrepareDependencyInjection] attribute, for example, QueryTestBase<TSchema, TDocumentBuilder>.");
16+
}
817
}

src/GraphQL.Tests/DI.xUnit/StructureMapAdapter.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using GraphQL.DI;
22
using GraphQL.StructureMap;
3-
using Microsoft.Extensions.DependencyInjection;
43
using StructureMap;
54

65
namespace GraphQL.Tests.DI;
@@ -15,5 +14,5 @@ public StructureMapAdapter(Action<IServiceRegister> configure)
1514
_builder = new GraphQLBuilder(new Registry(), b => configure(b.Services));
1615
}
1716

18-
public IServiceProvider ServiceProvider => _provider ??= ((Registry)_builder.Registry).BuildServiceProvider();
17+
public IServiceProvider ServiceProvider => _provider ??= new ServiceProviderAdapter(new Container((Registry)_builder.Registry));
1918
}

src/GraphQL.Tests/GraphQL.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<Import Project="../Tests.props" />
33

4+
<PropertyGroup>
5+
<NoWarn>$(NoWarn);IDE0060;xUnit1026</NoWarn> <!--Remove unused parameter 'container' if it is not part of a shipped public API/Theory method 'name' on test class 'class' does not use parameter 'container'.-->
6+
</PropertyGroup>
7+
48
<PropertyGroup Condition="'$(SingleTestPlatform)' == 'true'">
59
<TargetFramework>net6</TargetFramework>
610
</PropertyGroup>

src/GraphQL.Tests/Instrumentation/ApolloTracingTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
using GraphQL.Instrumentation;
2+
using GraphQL.Tests.DI;
23
using GraphQL.Tests.StarWars;
34

45
namespace GraphQL.Tests.Instrumentation
56
{
67
public class ApolloTracingTests : StarWarsTestBase
78
{
8-
[Fact]
9-
public void extension_has_expected_format()
9+
[Theory]
10+
[DependencyInjectionData]
11+
public void extension_has_expected_format(string container)
1012
{
1113
var query = @"
1214
query {

src/GraphQL.Tests/Language/CommentTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace GraphQL.Tests.Language
55
{
66
public class CommentTests
77
{
8-
private static readonly GraphQLDocumentBuilder _builder = new GraphQLDocumentBuilder { IgnoreComments = false };
8+
private static readonly GraphQLDocumentBuilder _builder = new() { IgnoreComments = false };
99

1010
[Fact]
1111
public void operation_comment_should_be_null()

src/GraphQL.Tests/StarWars/StarWarsBasicQueryTests.cs

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
using GraphQL.Tests.DI;
2+
13
namespace GraphQL.Tests.StarWars
24
{
35
public class StarWarsBasicQueryTests : StarWarsTestBase
46
{
5-
[Fact]
6-
public void identifies_r2_as_the_hero()
7+
[Theory]
8+
[DependencyInjectionData]
9+
public void identifies_r2_as_the_hero(string container)
710
{
811
var query = @"
912
query HeroNameQuery {
@@ -22,8 +25,9 @@ query HeroNameQuery {
2225
AssertQuerySuccess(query, expected);
2326
}
2427

25-
[Fact]
26-
public void can_query_without_query_name()
28+
[Theory]
29+
[DependencyInjectionData]
30+
public void can_query_without_query_name(string container)
2731
{
2832
var query = @"
2933
{
@@ -42,8 +46,9 @@ public void can_query_without_query_name()
4246
AssertQuerySuccess(query, expected);
4347
}
4448

45-
[Fact]
46-
public void can_query_for_the_id_and_friends_of_r2()
49+
[Theory]
50+
[DependencyInjectionData]
51+
public void can_query_for_the_id_and_friends_of_r2(string container)
4752
{
4853
var query = @"
4954
query HeroNameAndFriendsQuery {
@@ -75,8 +80,9 @@ query HeroNameAndFriendsQuery {
7580
AssertQuerySuccess(query, expected);
7681
}
7782

78-
[Fact]
79-
public void can_query_for_humans()
83+
[Theory]
84+
[DependencyInjectionData]
85+
public void can_query_for_humans(string container)
8086
{
8187
var query = @"
8288
{
@@ -97,8 +103,9 @@ public void can_query_for_humans()
97103
AssertQuerySuccess(query, expected);
98104
}
99105

100-
[Fact]
101-
public void can_query_for_friends_of_humans()
106+
[Theory]
107+
[DependencyInjectionData]
108+
public void can_query_for_friends_of_humans(string container)
102109
{
103110
var query = @"
104111
{
@@ -125,8 +132,9 @@ public void can_query_for_friends_of_humans()
125132
AssertQuerySuccess(query, expected);
126133
}
127134

128-
[Fact]
129-
public void can_query_for_connected_friends_of_humans()
135+
[Theory]
136+
[DependencyInjectionData]
137+
public void can_query_for_connected_friends_of_humans(string container)
130138
{
131139
var query = @"
132140
{
@@ -190,8 +198,9 @@ public void can_query_for_connected_friends_of_humans()
190198
AssertQuerySuccess(query, expected);
191199
}
192200

193-
[Fact]
194-
public void can_query_for_droids()
201+
[Theory]
202+
[DependencyInjectionData]
203+
public void can_query_for_droids(string container)
195204
{
196205
var query = @"
197206
{
@@ -210,8 +219,9 @@ public void can_query_for_droids()
210219
AssertQuerySuccess(query, expected);
211220
}
212221

213-
[Fact]
214-
public void can_query_for_connected_friends_of_droids_second_page()
222+
[Theory]
223+
[DependencyInjectionData]
224+
public void can_query_for_connected_friends_of_droids_second_page(string container)
215225
{
216226
var query = @"
217227
{
@@ -264,8 +274,9 @@ public void can_query_for_connected_friends_of_droids_second_page()
264274
AssertQuerySuccess(query, expected);
265275
}
266276

267-
[Fact]
268-
public void create_generic_query_that_fetches_luke()
277+
[Theory]
278+
[DependencyInjectionData]
279+
public void create_generic_query_that_fetches_luke(string container)
269280
{
270281
var query = @"
271282
query humanQuery($id: String!) {
@@ -287,8 +298,9 @@ query humanQuery($id: String!) {
287298
AssertQuerySuccess(query, expected, inputs);
288299
}
289300

290-
[Fact]
291-
public void query_same_root_field_using_alias()
301+
[Theory]
302+
[DependencyInjectionData]
303+
public void query_same_root_field_using_alias(string container)
292304
{
293305
var query = @"
294306
query SomeDroids {
@@ -314,8 +326,9 @@ query SomeDroids {
314326
AssertQuerySuccess(query, expected);
315327
}
316328

317-
[Fact]
318-
public void can_add_new_human()
329+
[Theory]
330+
[DependencyInjectionData]
331+
public void can_add_new_human(string container)
319332
{
320333
var mutation = @"mutation ($human:HumanInput!){ createHuman(human: $human) { name homePlanet } }";
321334

0 commit comments

Comments
 (0)