StructureMap.Microsoft.DependencyInjection icon indicating copy to clipboard operation
StructureMap.Microsoft.DependencyInjection copied to clipboard

Microsoft.Extensions.Options and child container - failing test case

Open dazinator opened this issue 7 years ago • 5 comments

Hello,

I have put together a couple of test cases to show this issue. I'm seeing some funny behaviour when attempting to use Microsoft.Extensions.Options;.

This first test case shows adding Options to a root level container, then resolving them, and it passes:


       [Fact]
        public void Options_Register_Root_Resolve_Root()
        {

            ServiceCollection services = new ServiceCollection();
            services.AddOptions();
            services.Configure<MyOptions>((a) =>
            {
                a.Prop = true;
            });       

            StructureMap.Container container = new StructureMap.Container();
            container.Populate(services);

            IServiceProvider sp = container.GetInstance<IServiceProvider>();
            IOptions<MyOptions> options = sp.GetRequiredService<IOptions<MyOptions>>();
            Assert.True(options.Value?.Prop);

        }      

That's fine so far. The problem comes when I try and configure this at child container level.

Here is the failing test case:

       [Fact]
        public void Options_Register_Child_Resolve_Child()
        {

            ServiceCollection services = new ServiceCollection();         
          
            StructureMap.Container container = new StructureMap.Container();
            container.Populate(services);

            var childContainer = container.CreateChildContainer();
            childContainer.Configure((a) =>
            {
                var childServices = new ServiceCollection();
                childServices.AddOptions();
                childServices.Configure<MyOptions>((b) =>
                {
                    b.Prop = true;
                });
                a.Populate(childServices);
            });         

            IServiceProvider sp = childContainer.GetInstance<IServiceProvider>();
            IOptions<MyOptions> options = sp.GetRequiredService<IOptions<MyOptions>>();
            Assert.True(options.Value?.Prop);

        }

This latter test case, the delegate to configure the option b.Prop = true; is never called.

I'm not very advanced with structuremap, would appreciate any guidance etc.

Thanks

dazinator avatar Aug 19 '18 14:08 dazinator

Any updates on this one?

dazinator avatar Jan 06 '19 14:01 dazinator

I'm not really sure what to do about this one? I don't really know SM well enough to say what the issue might be or how to fix it.

khellang avatar Jan 06 '19 15:01 khellang

That makes two of us ;-) I found this issue: https://github.com/structuremap/structuremap/issues/618 which looks very similar but I don't think it has really been resolved despite being closed.

dazinator avatar Jan 06 '19 16:01 dazinator

It seems structuremap is no longer actively supported, and the replacement is Lamar: https://jasperfx.github.io/lamar/documentation/ioc/

I'll close this issue for now, i'll probably end up dropping support for structuremap completely, and tryijng out lamar at some point down the road.

dazinator avatar Jan 06 '19 17:01 dazinator

I can't use Lamar because Lamar doesnt support (or intend to support) child containers - which is something I'm dependent upon in order to model system wide, and per tenant wide services in a multitenant platform.

dazinator avatar Jul 27 '19 10:07 dazinator