using Unity; using Xunit; namespace VCommon.Ioc.Tests { public class ChildContainerTests { public class Session { public int UserId { get; set; } } public class Setting : ISingletonIocClass { public string Value { get; set; } = "Keep"; } public abstract class AbstractContext { } private class ContextImpl : AbstractContext { } public class Service : ITransientIocClass { [Dependency] public AbstractContext Context { get; set; } } [Fact] public void ChildContainerTest() { var rootContainer = new IocManager(); var child1 = rootContainer.CreateChildren(); var child2 = rootContainer.CreateChildren(); var child3 = rootContainer.CreateChildren(); child1.RegisterInstanceToContainer(new Session { UserId = 1 }); child2.RegisterInstanceToContainer(new Session { UserId = 2 }); child3.RegisterInstanceToContainer(new ContextImpl()); Assert.Same(rootContainer, rootContainer.Resolve()); Assert.Same(child1, child1.Resolve()); Assert.Same(child2, child2.Resolve()); Assert.Same(child3, child3.Resolve()); Assert.True(rootContainer.IsRegistered()); Assert.True(child1.IsRegistered()); Assert.True(child2.IsRegistered()); Assert.Same(rootContainer.Resolve(), child1.Resolve()); Assert.Same(rootContainer.Resolve(), child2.Resolve()); Assert.False(rootContainer.IsRegistered()); Assert.True(child1.IsRegistered()); Assert.True(child2.IsRegistered()); Assert.False(child3.IsRegistered()); Assert.Equal(1, child1.Resolve().UserId); Assert.Equal(2, child2.Resolve().UserId); Assert.True(rootContainer.IsRegistered()); Assert.True(child1.IsRegistered()); Assert.True(child2.IsRegistered()); Assert.True(child3.IsRegistered()); Assert.Throws(() => rootContainer.Resolve()); Assert.Throws(() => child1.Resolve()); Assert.Throws(() => child2.Resolve()); child3.Resolve(); } } }