public void When_resolving_type_with_container_controlled_lifetime_then_returns_same_instance_every_time()
        {
            using (var container = new UnityContainer())
            {
                container.RegisterType <IFoo, Foo>(new ContainerControlledLifetimeManager());
                using (var resolver = new UnityHierarchicalDependencyResolver(container))
                {
                    IFoo parentResolve = (IFoo)resolver.GetService(typeof(IFoo));
                    IFoo scope1Resolve;
                    IFoo scope2Resolve;

                    using (var scope = resolver.BeginScope())
                    {
                        scope1Resolve = (IFoo)scope.GetService(typeof(IFoo));
                    }

                    using (var scope = resolver.BeginScope())
                    {
                        scope2Resolve = (IFoo)scope.GetService(typeof(IFoo));
                    }

                    Assert.IsNotNull(parentResolve);
                    Assert.AreSame(parentResolve, scope1Resolve);
                    Assert.AreSame(parentResolve, scope2Resolve);
                }
            }
        }
 public void When_resolving_unregistered_type_then_returns_null()
 {
     using (var container = new UnityContainer())
     {
         using (var resolver = new UnityHierarchicalDependencyResolver(container))
         {
             Assert.IsNull(resolver.GetService(typeof(IFoo)));
         }
     }
 }
 public void When_resolving_then_returns_registered_instance()
 {
     using (var container = new UnityContainer())
     {
         container.RegisterInstance <IFoo>(new Foo {
             TestProperty = "value"
         });
         using (var resolver = new UnityHierarchicalDependencyResolver(container))
         {
             var actual = (IFoo)resolver.GetService(typeof(IFoo));
             Assert.AreEqual("value", actual.TestProperty);
         }
     }
 }
        public void When_disposing_scope_then_does_not_dispose_container()
        {
            using (var container = new UnityContainer())
            {
                container.RegisterInstance <IFoo>(new Foo {
                    TestProperty = "value"
                });
                using (var resolver = new UnityHierarchicalDependencyResolver(container))
                {
                    resolver.BeginScope().Dispose();

                    var actual = (IFoo)resolver.GetService(typeof(IFoo));

                    Assert.AreEqual("value", actual.TestProperty);
                }
            }
        }
        public void When_resolving_type_with_hierarchical_lifetime_then_returns_different_instance_in_each_scope()
        {
            using (var container = new UnityContainer())
            {
                container.RegisterType <IFoo, Foo>(new HierarchicalLifetimeManager());
                using (var resolver = new UnityHierarchicalDependencyResolver(container))
                {
                    IFoo parentResolve = (IFoo)resolver.GetService(typeof(IFoo));
                    IFoo scope1Resolve1;
                    IFoo scope1Resolve2;
                    IFoo scope2Resolve1;
                    IFoo scope2Resolve2;

                    using (var scope = resolver.BeginScope())
                    {
                        scope1Resolve1 = (IFoo)scope.GetService(typeof(IFoo));
                        scope1Resolve2 = (IFoo)scope.GetService(typeof(IFoo));
                    }

                    using (var scope = resolver.BeginScope())
                    {
                        scope2Resolve1 = (IFoo)scope.GetService(typeof(IFoo));
                        scope2Resolve2 = (IFoo)scope.GetService(typeof(IFoo));
                    }

                    Assert.IsNotNull(parentResolve);
                    Assert.IsNotNull(scope1Resolve1);
                    Assert.IsNotNull(scope1Resolve2);
                    Assert.IsNotNull(scope2Resolve1);
                    Assert.IsNotNull(scope2Resolve2);

                    Assert.AreNotSame(parentResolve, scope1Resolve1);
                    Assert.AreNotSame(parentResolve, scope2Resolve1);

                    Assert.AreNotSame(scope1Resolve1, scope2Resolve1);

                    Assert.AreSame(scope1Resolve1, scope1Resolve2);

                    Assert.AreSame(scope2Resolve1, scope2Resolve2);
                }
            }
        }