public void WhenOverridingWithMultiplePolymorphicTypesAndSomeDoNotHaveMatchingConstructor()
        {
            IInterfaceForTypesToInject defaultInjectedObject  = new TypeToInject1(123);
            IInterfaceForTypesToInject overrideInjectedObject = new TypeToInject2(-9999);

            IUnityContainer container = new UnityContainer();

            container.RegisterType <ISubjectTypeToInject, SubjectType1ToInject>("SubjectType1ToInject", new InjectionConstructor(defaultInjectedObject));
            container.RegisterType <ISubjectTypeToInject, SubjectType2ToInject>("SubjectType2ToInject", new InjectionConstructor(defaultInjectedObject));
            container.RegisterType <ISubjectTypeToInject, SubjectType3ToInject>("SubjectType3ToInject", new InjectionConstructor(1, "abc"));

            System.Collections.Generic.IEnumerable <ISubjectTypeToInject> overriddenList = container.ResolveAll <ISubjectTypeToInject>(new ParameterOverride("injectedObject", overrideInjectedObject));
            System.Collections.Generic.IEnumerable <ISubjectTypeToInject> defaultList    = container.ResolveAll <ISubjectTypeToInject>();

            System.Collections.Generic.List <ISubjectTypeToInject> myOverridenList = new System.Collections.Generic.List <ISubjectTypeToInject>(overriddenList);

            int injectedCount = 0;
            int count         = 0;

            foreach (var item in myOverridenList)
            {
                count++;
                if (item.InjectedObject != null && item.InjectedObject.Value == -9999)
                {
                    injectedCount++;
                }
            }

            Assert.AreEqual <int>(2, injectedCount);
            Assert.AreEqual <int>(3, count);
        }
        public void WhenInjectingConstructorWithOverrideAsDifferentPolymorphicType()
        {
            IInterfaceForTypesToInject defaultInjectionParameter = new TypeToInject1(-1);
            IInterfaceForTypesToInject overrideInjectionParameter = new TypeToInject2(9999);
            var container = new UnityContainer()
                .RegisterType<SubjectType1ToInject>(new InjectionConstructor(defaultInjectionParameter));

            var result =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter));

            Assert.IsInstanceOfType(result.InjectedObject, typeof(TypeToInject2));
            Assert.AreEqual<int>(9999, result.InjectedObject.Value);
        }
        public void WhenInjectingConstructorWithOverrideAsDifferentPolymorphicType()
        {
            IInterfaceForTypesToInject defaultInjectionParameter  = new TypeToInject1(-1);
            IInterfaceForTypesToInject overrideInjectionParameter = new TypeToInject2(9999);
            var container = new UnityContainer()
                            .RegisterType <SubjectType1ToInject>(new InjectionConstructor(defaultInjectionParameter));

            var result =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter));

            Assert.IsInstanceOfType(result.InjectedObject, typeof(TypeToInject2));
            Assert.AreEqual <int>(9999, result.InjectedObject.Value);
        }
        public void WhenInjectingConstructorWithOverrideAndNoDefault()
        {
            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject1(9999);
            IInterfaceForTypesToInject overrideInjectionParameter2 = new TypeToInject2(8888);
            var container = new UnityContainer()
                            .RegisterType <SubjectType1ToInject>();

            var result1 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));

            var result2 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter2));

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject1));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
        }
        public void CanOverrideMultipleTimes()
        {
            IInterfaceForTypesToInject defaultParameter = new TypeToInject1(9999);

            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject2(9999);
            IInterfaceForTypesToInject overrideInjectionParameter2 = new TypeToInject3(8888);
            var container = new UnityContainer()
                .RegisterType<SubjectType1ToInject>(new InjectionConstructor(defaultParameter));

            var result1 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));

            var result2 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter2));
            var result3 =
                container.Resolve<SubjectType1ToInject>();

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject3));
        }
        public void CanOverrideMultipleTimes()
        {
            IInterfaceForTypesToInject defaultParameter = new TypeToInject1(9999);

            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject2(9999);
            IInterfaceForTypesToInject overrideInjectionParameter2 = new TypeToInject3(8888);
            var container = new UnityContainer()
                            .RegisterType <SubjectType1ToInject>(new InjectionConstructor(defaultParameter));

            var result1 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));

            var result2 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter2));
            var result3 =
                container.Resolve <SubjectType1ToInject>();

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject3));
        }
        public void WhenInjectingConstructorWithContainerControllerLifeTime()
        {
            IInterfaceForTypesToInject defaultParameter            = new TypeToInject1(9999);
            IInterfaceForTypesToInject overrideInjectionParameter  = new TypeToInject2(8888);
            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject3(7777);

            var container = new UnityContainer()
                            .RegisterType <SubjectType1ToInject>(new ContainerControlledLifetimeManager(), new InjectionConstructor(defaultParameter));

            var result1 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter));
            var result2 =
                container.Resolve <SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));
            var result3 =
                container.Resolve <SubjectType1ToInject>();

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
        }
        public void WhenInjectingConstructorWithOverrideAndNoDefault()
        {
            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject1(9999);
            IInterfaceForTypesToInject overrideInjectionParameter2 = new TypeToInject2(8888);
            var container = new UnityContainer()
                .RegisterType<SubjectType1ToInject>();

            var result1 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));

            var result2 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter2));

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject1));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
        }
        public void WhenOverridingWithMultiplePolymorphicTypesAndSomeDoNotHaveMatchingConstructor()
        {
            IInterfaceForTypesToInject defaultInjectedObject = new TypeToInject1(123);
            IInterfaceForTypesToInject overrideInjectedObject = new TypeToInject2(-9999);
            
            IUnityContainer container = new UnityContainer();
            
            container.RegisterType<ISubjectTypeToInject, SubjectType1ToInject>("SubjectType1ToInject", new InjectionConstructor(defaultInjectedObject));
            container.RegisterType<ISubjectTypeToInject, SubjectType2ToInject>("SubjectType2ToInject", new InjectionConstructor(defaultInjectedObject));
            container.RegisterType<ISubjectTypeToInject, SubjectType3ToInject>("SubjectType3ToInject", new InjectionConstructor(1, "abc"));

            System.Collections.Generic.IEnumerable<ISubjectTypeToInject> overriddenList = container.ResolveAll<ISubjectTypeToInject>(new ParameterOverride("injectedObject", overrideInjectedObject));
            System.Collections.Generic.IEnumerable<ISubjectTypeToInject> defaultList = container.ResolveAll<ISubjectTypeToInject>();

            System.Collections.Generic.List<ISubjectTypeToInject> myOverridenList = new System.Collections.Generic.List<ISubjectTypeToInject>(overriddenList);

            int injectedCount = 0;
            int count = 0;
            foreach (var item in myOverridenList)
            {
                count++;
                if (item.InjectedObject != null && item.InjectedObject.Value == -9999)
                {
                    injectedCount++;
                }
            }

            Assert.AreEqual<int>(2, injectedCount);
            Assert.AreEqual<int>(3, count);
        }
        public void WhenInjectingConstructorWithContainerControllerLifeTime()
        {
            IInterfaceForTypesToInject defaultParameter = new TypeToInject1(9999);
            IInterfaceForTypesToInject overrideInjectionParameter = new TypeToInject2(8888);
            IInterfaceForTypesToInject overrideInjectionParameter1 = new TypeToInject3(7777);
         
            var container = new UnityContainer()
                .RegisterType<SubjectType1ToInject>(new ContainerControlledLifetimeManager(), new InjectionConstructor(defaultParameter));

            var result1 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter));
            var result2 =
                container.Resolve<SubjectType1ToInject>(new ParameterOverride("injectedObject", overrideInjectionParameter1));
            var result3 =
                container.Resolve<SubjectType1ToInject>();

            Assert.IsInstanceOfType(result1.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
            Assert.IsInstanceOfType(result2.InjectedObject, typeof(TypeToInject2));
        }