public void ChildContainerShouldBeDisposed() { var ioc = new ServiceContainer(); var childContainer = ioc.CreateChildContainer(); ioc.Dispose(); Assert.That(() => childContainer.Clear(), Throws.TypeOf(typeof(ObjectDisposedException))); }
public void CreateChildContainer() { var ioc = new ServiceContainer(); Assert.AreSame(ioc, ioc.Cast <object>().First()); var childContainer = ioc.CreateChildContainer(); Assert.AreSame(childContainer, childContainer.Cast <object>().First()); }
public void ComplexHierarchy() { // Build hierarchy. var root = new ServiceContainer(); var child1 = root.CreateChildContainer(); child1.Register(typeof(IService1), "token1", typeof(Service1), CreationPolicy.Shared); // Register root services after child1 is created to see whether new services // are properly inherited. root.Register(typeof(IService1), null, typeof(Service1), CreationPolicy.Shared); root.Register(typeof(IService2), null, typeof(Service2), CreationPolicy.LocalShared); root.Register(typeof(IService3), null, typeof(Service3), CreationPolicy.NonShared); var child2 = child1.CreateChildContainer(); child2.Register(typeof(IService1), null, typeof(Service1), CreationPolicy.Shared); child2.Register(typeof(IService1), "token2", typeof(DisposableService), CreationPolicy.Shared); // Resolve services. var service1InChild2 = child2.GetInstance <IService1>(); var service2InChild2 = child2.GetInstance <IService2>(); var service3InChild2 = child2.GetInstance <IService3>(); var disposableServiceInChild2 = child2.GetInstance <IService1>("token2"); var service3InChild1 = child1.GetInstance <IService3>(); var service2InChild1 = child1.GetInstance <IService2>(); var service1InChild1 = child1.GetInstance <IService1>(); var namedService1InChild1 = child1.GetInstance <IService1>("token1"); var namedService1InChild2 = child2.GetInstance <IService1>("token1"); var service1InRoot = root.GetInstance <IService1>(); var service3InRoot = root.GetInstance <IService3>(); var service2InRoot = root.GetInstance <IService2>(); // Check root services. Assert.IsNotNull(service1InRoot); Assert.IsNotNull(service2InRoot); Assert.IsNotNull(service3InRoot); Assert.IsNull(root.GetInstance <IService1>("token1")); Assert.AreSame(root, root.GetInstance <ServiceContainer>()); Assert.AreSame(service1InRoot, root.GetInstance <IService1>()); Assert.AreSame(service2InRoot, root.GetInstance <IService2>()); Assert.AreNotSame(service3InRoot, root.GetInstance <IService3>()); Assert.AreSame(service1InRoot, service3InRoot.Service1); Assert.AreSame(service2InRoot, service3InRoot.Service2); Assert.IsNull(service2InRoot.Service1); root.ResolveProperties(service2InRoot); Assert.AreSame(service1InRoot, service2InRoot.Service1); // Check child1 services. Assert.IsNotNull(service1InChild1); Assert.IsNotNull(service2InChild1); Assert.IsNotNull(service3InChild1); Assert.IsNotNull(namedService1InChild1); Assert.AreSame(child1, child1.GetInstance <ServiceContainer>()); Assert.AreSame(service1InChild1, child1.GetInstance <IService1>()); Assert.AreSame(service2InChild1, child1.GetInstance <IService2>()); Assert.AreNotSame(service3InChild1, child1.GetInstance <IService3>()); Assert.AreSame(service1InChild1, service3InChild1.Service1); Assert.AreSame(service2InChild1, service3InChild1.Service2); Assert.IsNull(service2InChild1.Service1); child1.ResolveProperties(service2InChild1); Assert.AreSame(service1InChild1, service2InChild1.Service1); Assert.AreSame(service1InRoot, service1InChild1); Assert.AreNotSame(service2InRoot, service2InChild1); // Check child2 services. Assert.IsNotNull(service1InChild2); Assert.IsNotNull(service2InChild2); Assert.IsNotNull(service3InChild2); Assert.IsNotNull(namedService1InChild2); Assert.IsNotNull(disposableServiceInChild2); Assert.AreSame(child2, child2.GetInstance <ServiceContainer>()); Assert.AreSame(service1InChild2, child2.GetInstance <IService1>()); Assert.AreSame(service2InChild2, child2.GetInstance <IService2>()); Assert.AreNotSame(service3InChild2, child2.GetInstance <IService3>()); Assert.AreSame(service1InChild2, service3InChild2.Service1); Assert.AreSame(service2InChild2, service3InChild2.Service2); Assert.IsNull(service2InChild2.Service1); child2.ResolveProperties(service2InChild2); Assert.AreSame(service1InChild2, service2InChild2.Service1); Assert.AreNotSame(service1InRoot, service1InChild2); Assert.AreNotSame(service1InChild1, service1InChild2); Assert.AreNotSame(service2InRoot, service2InChild2); Assert.AreNotSame(service2InChild1, service2InChild2); Assert.AreSame(child1.GetInstance <IService1>("token1"), child2.GetInstance <IService1>("token1")); Assert.AreSame(disposableServiceInChild2, child2.GetInstance <IService1>("token2")); var service1InstancesInChild2 = child2.GetAllInstances <IService1>().ToArray(); Assert.AreEqual(2, service1InstancesInChild2.Length); Assert.IsTrue(service1InstancesInChild2.Contains(namedService1InChild1)); Assert.IsTrue(service1InstancesInChild2.Contains(disposableServiceInChild2)); // Unregister local entry. child2.Unregister(typeof(IService1)); Assert.AreSame(service1InRoot, child2.GetInstance <IService1>()); // Dispose hierarchy. root.Dispose(); Assert.IsTrue(((DisposableService)disposableServiceInChild2).Disposed); }
public void ComplexHierarchy() { // Build hierarchy. var root = new ServiceContainer(); var child1 = root.CreateChildContainer(); child1.Register(typeof(IService1), "token1", typeof(Service1), CreationPolicy.Shared); // Register root services after child1 is created to see whether new services // are properly inherited. root.Register(typeof(IService1), null, typeof(Service1), CreationPolicy.Shared); root.Register(typeof(IService2), null, typeof(Service2), CreationPolicy.LocalShared); root.Register(typeof(IService3), null, typeof(Service3), CreationPolicy.NonShared); var child2 = child1.CreateChildContainer(); child2.Register(typeof(IService1), null, typeof(Service1), CreationPolicy.Shared); child2.Register(typeof(IService1), "token2", typeof(DisposableService), CreationPolicy.Shared); // Resolve services. var service1InChild2 = child2.GetInstance<IService1>(); var service2InChild2 = child2.GetInstance<IService2>(); var service3InChild2 = child2.GetInstance<IService3>(); var disposableServiceInChild2 = child2.GetInstance<IService1>("token2"); var service3InChild1 = child1.GetInstance<IService3>(); var service2InChild1 = child1.GetInstance<IService2>(); var service1InChild1 = child1.GetInstance<IService1>(); var namedService1InChild1 = child1.GetInstance<IService1>("token1"); var namedService1InChild2 = child2.GetInstance<IService1>("token1"); var service1InRoot = root.GetInstance<IService1>(); var service3InRoot = root.GetInstance<IService3>(); var service2InRoot = root.GetInstance<IService2>(); // Check root services. Assert.IsNotNull(service1InRoot); Assert.IsNotNull(service2InRoot); Assert.IsNotNull(service3InRoot); Assert.IsNull(root.GetInstance<IService1>("token1")); Assert.AreSame(root, root.GetInstance<ServiceContainer>()); Assert.AreSame(service1InRoot, root.GetInstance<IService1>()); Assert.AreSame(service2InRoot, root.GetInstance<IService2>()); Assert.AreNotSame(service3InRoot, root.GetInstance<IService3>()); Assert.AreSame(service1InRoot, service3InRoot.Service1); Assert.AreSame(service2InRoot, service3InRoot.Service2); Assert.IsNull(service2InRoot.Service1); root.ResolveProperties(service2InRoot); Assert.AreSame(service1InRoot, service2InRoot.Service1); // Check child1 services. Assert.IsNotNull(service1InChild1); Assert.IsNotNull(service2InChild1); Assert.IsNotNull(service3InChild1); Assert.IsNotNull(namedService1InChild1); Assert.AreSame(child1, child1.GetInstance<ServiceContainer>()); Assert.AreSame(service1InChild1, child1.GetInstance<IService1>()); Assert.AreSame(service2InChild1, child1.GetInstance<IService2>()); Assert.AreNotSame(service3InChild1, child1.GetInstance<IService3>()); Assert.AreSame(service1InChild1, service3InChild1.Service1); Assert.AreSame(service2InChild1, service3InChild1.Service2); Assert.IsNull(service2InChild1.Service1); child1.ResolveProperties(service2InChild1); Assert.AreSame(service1InChild1, service2InChild1.Service1); Assert.AreSame(service1InRoot, service1InChild1); Assert.AreNotSame(service2InRoot, service2InChild1); // Check child2 services. Assert.IsNotNull(service1InChild2); Assert.IsNotNull(service2InChild2); Assert.IsNotNull(service3InChild2); Assert.IsNotNull(namedService1InChild2); Assert.IsNotNull(disposableServiceInChild2); Assert.AreSame(child2, child2.GetInstance<ServiceContainer>()); Assert.AreSame(service1InChild2, child2.GetInstance<IService1>()); Assert.AreSame(service2InChild2, child2.GetInstance<IService2>()); Assert.AreNotSame(service3InChild2, child2.GetInstance<IService3>()); Assert.AreSame(service1InChild2, service3InChild2.Service1); Assert.AreSame(service2InChild2, service3InChild2.Service2); Assert.IsNull(service2InChild2.Service1); child2.ResolveProperties(service2InChild2); Assert.AreSame(service1InChild2, service2InChild2.Service1); Assert.AreNotSame(service1InRoot, service1InChild2); Assert.AreNotSame(service1InChild1, service1InChild2); Assert.AreNotSame(service2InRoot, service2InChild2); Assert.AreNotSame(service2InChild1, service2InChild2); Assert.AreSame(child1.GetInstance<IService1>("token1"), child2.GetInstance<IService1>("token1")); Assert.AreSame(disposableServiceInChild2, child2.GetInstance<IService1>("token2")); var service1InstancesInChild2 = child2.GetAllInstances<IService1>().ToArray(); Assert.AreEqual(2, service1InstancesInChild2.Length); Assert.IsTrue(service1InstancesInChild2.Contains(namedService1InChild1)); Assert.IsTrue(service1InstancesInChild2.Contains(disposableServiceInChild2)); // Unregister local entry. child2.Unregister(typeof(IService1)); Assert.AreSame(service1InRoot, child2.GetInstance<IService1>()); // Dispose hierarchy. root.Dispose(); Assert.IsTrue(((DisposableService)disposableServiceInChild2).Disposed); }
public void CreateChildContainer() { var ioc = new ServiceContainer(); Assert.AreSame(ioc, ioc.Cast<object>().First()); var childContainer = ioc.CreateChildContainer(); Assert.AreSame(childContainer, childContainer.Cast<object>().First()); }