Skip to content

Commit 75c6227

Browse files
authored
Ensure container has IServiceProvider/ScopeFactory (#3)
Testing a Registry that uses Configure()/Register() should not depend on calling Populate() for factory or scoped service descriptors to work. > StructureMap.StructureMapConfigurationException: > No default Instance is registered and cannot be automatically determined > for type 'System.IServiceProvider' Workaround: ``` var container = new Container(); container.Configure(c => { c.IncludeRegistry<MyRegistry>(); c.Populate([]); }); container.AssertConfigurationIsValid(); ```
1 parent a942d59 commit 75c6227

2 files changed

Lines changed: 45 additions & 8 deletions

File tree

src/StructureMap.Microsoft.DependencyInjection/ContainerExtensions.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,6 @@ public static void Populate(this Registry registry, IEnumerable<ServiceDescripto
9595

9696
registry.Policies.ConstructorSelector<AspNetConstructorSelector>();
9797

98-
registry.For<IServiceProvider>()
99-
.LifecycleIs(Lifecycles.Container)
100-
.Use<StructureMapServiceProvider>();
101-
102-
registry.For<IServiceScopeFactory>()
103-
.LifecycleIs(Lifecycles.Container)
104-
.Use<StructureMapServiceScopeFactory>();
105-
10698
registry.Register(descriptors);
10799
}
108100

@@ -135,6 +127,16 @@ public static void Configure(this IProfileRegistry registry, Func<IServiceCollec
135127
/// <param name="descriptors">The service descriptors.</param>
136128
public static void Register(this IProfileRegistry registry, IEnumerable<ServiceDescriptor> descriptors)
137129
{
130+
// Required for factory service descriptors
131+
registry.For<IServiceProvider>()
132+
.LifecycleIs(Lifecycles.Container)
133+
.UseIfNone<StructureMapServiceProvider>();
134+
135+
// Required for scoped service descriptors
136+
registry.For<IServiceScopeFactory>()
137+
.LifecycleIs(Lifecycles.Container)
138+
.UseIfNone<StructureMapServiceScopeFactory>();
139+
138140
foreach (var descriptor in descriptors)
139141
{
140142
registry.Register(descriptor);

test/StructureMap.Microsoft.DependencyInjection.Tests/StructureMapContainerTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,41 @@ public void ConfigureAndRegisterDoNotPreventPopulate()
6161
Assert.NotNull(container.GetInstance<IFakeScopedService>());
6262
}
6363

64+
[Fact]
65+
public void ConfigureDoesNotRequirePopulate()
66+
{
67+
var container = new Container();
68+
container.Configure(config =>
69+
{
70+
config.Configure(services => services
71+
.AddScoped<IFakeScopedService>(_ => new FakeService())
72+
);
73+
});
74+
75+
Assert.NotNull(container.GetInstance<IFakeScopedService>());
76+
77+
Assert.NotNull(container.GetInstance<IServiceProvider>());
78+
Assert.NotNull(container.GetInstance<IServiceScopeFactory>());
79+
}
80+
81+
[Fact]
82+
public void RegisterDoesNotRequirePopulate()
83+
{
84+
var container = new Container();
85+
container.Configure(config =>
86+
{
87+
var services = new ServiceCollection()
88+
.AddScoped<IFakeScopedService>(_ => new FakeService());
89+
90+
config.Register(services);
91+
});
92+
93+
Assert.NotNull(container.GetInstance<IFakeScopedService>());
94+
95+
Assert.NotNull(container.GetInstance<IServiceProvider>());
96+
Assert.NotNull(container.GetInstance<IServiceScopeFactory>());
97+
}
98+
6499
[Theory]
65100
[InlineData(true)]
66101
[InlineData(false)]

0 commit comments

Comments
 (0)