Skip to content

Commit c2fcc09

Browse files
committed
Ensure container has IServiceProvider/ScopeFactory
Testing a Registry that uses Configure()/Register() should not depend on calling Populate() for factory 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([]); // Make IServiceProvider available }); container.AssertConfigurationIsValid(); ```
1 parent a942d59 commit c2fcc09

2 files changed

Lines changed: 49 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: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,45 @@ 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, FakeService>()
72+
.AddTransient<IFakeService>(_ => new FakeService())
73+
);
74+
});
75+
76+
Assert.NotNull(container.GetInstance<IFakeService>());
77+
Assert.NotNull(container.GetInstance<FakeService>());
78+
79+
Assert.NotNull(container.GetInstance<IServiceProvider>());
80+
Assert.NotNull(container.GetInstance<IServiceScopeFactory>());
81+
}
82+
83+
[Fact]
84+
public void RegisterDoesNotRequirePopulate()
85+
{
86+
var container = new Container();
87+
container.Configure(config =>
88+
{
89+
var services = new ServiceCollection()
90+
.AddScoped<IFakeScopedService, FakeService>()
91+
.AddTransient<IFakeService>(_ => new FakeService());
92+
93+
config.Register(services);
94+
});
95+
96+
Assert.NotNull(container.GetInstance<IFakeService>());
97+
Assert.NotNull(container.GetInstance<FakeService>());
98+
99+
Assert.NotNull(container.GetInstance<IServiceProvider>());
100+
Assert.NotNull(container.GetInstance<IServiceScopeFactory>());
101+
}
102+
64103
[Theory]
65104
[InlineData(true)]
66105
[InlineData(false)]

0 commit comments

Comments
 (0)