/// <summary>
        ///     IoC 컨테이너가 제공하는 객체 처리를 수행합니다.
        /// </summary>
        /// <param name="element">	컨테이너 요소입니다. </param>
        /// <param name="lifetime">	The lifetime. </param>
        /// <param name="constructor">역직렬화된 생성자 요소입니다.</param>
        /// <param name="properties">역직렬화된 속성(Property) 요소입니다.</param>
        /// <param name="methods">역직렬화된 메서드 요소입니다.</param>
        protected override void ResolveRegisterProcessor(RegisterElement element, LifetimeFlag lifetime, IEnumerable <object> constructor, IEnumerable <object> properties, IEnumerable <object> methods)
        {
            var component = Component.For(Type.GetType(element.contract))
                            .ImplementedBy(Type.GetType(element.dependencyTo))
                            .Named(element.key);

            if (constructor != null)
            {
                var constructorParams = ((List <object>)constructor.First());
                constructorParams.Where(o => o is Parameter).Cast <Parameter>().ToList().ForEach(o => component.Parameters(o));
                constructorParams.Where(o => o is DynamicParametersDelegate).Cast <DynamicParametersDelegate>().ToList().ForEach(@delegate =>
                                                                                                                                 component.DynamicParameters((kernel, d) => @delegate(kernel, d)));
            }

            if (properties != null)
            {
                properties.Where(o => o is Property).Cast <Property>().ToList().ForEach(o => component.DependsOn(o));
                properties.Where(o => o is DynamicParametersDelegate).Cast <DynamicParametersDelegate>().ToList().ForEach(@delegate =>
                                                                                                                          component.DynamicParameters((kernel, d) => @delegate(kernel, d)));
            }

            if (methods != null)
            {
                throw new NotSupportedException("FrameworkContainerForCastle 은 현재 Method Injection 을 지원하지 않습니다.");
            }

            container.ContainerObject.Register(component);
        }
        public void Then_SectionWithExtendedValueElementsIsSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializingExtensionElements.config", s =>
            {
                var registration = new RegisterElement
                {
                    TypeName = "SomeType"
                };

                var prop = new PropertyElement()
                {
                    Name  = "MyProp",
                    Value = new SeventeenValueElement()
                };

                registration.InjectionMembers.Add(prop);

                var container = new ContainerElement();
                container.Registrations.Add(registration);
                s.Containers.Add(container);
                s.SectionExtensions.Add(new SectionExtensionElement
                {
                    TypeName = typeof(TestSectionExtension).AssemblyQualifiedName,
                    Prefix   = "pre1"
                });
            });

            loadedSection.Containers.Default.Registrations[0].InjectionMembers
            .OfType <PropertyElement>()
            .Select(p => p.Value.GetType())
            .AssertContainsExactly(typeof(SeventeenValueElement));
        }
        public void Then_BehaviorElementsGetSerialized()
        {
            var loadedSection = SerializeAndLoadConfig("SerializingInjectionMembers.config", c =>
            {
                var reg = new RegisterElement
                {
                    TypeName = "SomeType"
                };

                reg.InjectionMembers.Add(new InterceptionBehaviorElement()
                {
                    TypeName = "SomeBehavior"
                });

                reg.InjectionMembers.Add(new InterceptionBehaviorElement()
                {
                    Name     = "NamedBehavior",
                    TypeName = "SomeOtherBehavior"
                });
                c.Registrations.Add(reg);
            });

            var injectionMembers =
                loadedSection.Containers.Default.Registrations[0].InjectionMembers
                .Cast <InterceptionBehaviorElement>();

            injectionMembers.Select(m => m.TypeName)
            .AssertContainsExactly("SomeBehavior", "SomeOtherBehavior");
            injectionMembers.Select(m => m.Name)
            .AssertContainsExactly(String.Empty, "NamedBehavior");
        }
        /// <summary>
        ///     IoC 컨테이너가 제공하는 객체 처리를 수행합니다.
        /// </summary>
        /// <param name="element">	컨테이너 요소입니다. </param>
        /// <param name="lifetime">	The lifetime. </param>
        /// <param name="constructor">역직렬화된 생성자 요소입니다.</param>
        /// <param name="properties">역직렬화된 속성(Property) 요소입니다.</param>
        /// <param name="methods">역직렬화된 메서드 요소입니다.</param>
        protected override void ResolveRegisterProcessor(RegisterElement element, LifetimeFlag lifetime, IEnumerable <object> constructor, IEnumerable <object> properties, IEnumerable <object> methods)
        {
            var concat = Enumerable.Empty <InjectionMember>();

            if (constructor != null)
            {
                concat = concat.Concat(constructor.Cast <InjectionMember>());
            }
            if (properties != null)
            {
                concat = concat.Concat(properties.Cast <InjectionMember>());
            }
            if (methods != null)
            {
                concat = concat.Concat(methods.Cast <InjectionMember>());
            }

            var contractType   = Type.GetType(element.contract);
            var dependencyType = Type.GetType(element.dependencyTo);

            try
            {
                container.ContainerObject.RegisterType(
                    contractType,
                    dependencyType,
                    element.key,
                    container.LifetimeMapping.GetLifetimeObject(lifetime),
                    concat.ToArray());
            }
            catch (NotSupportedException) { }
            catch (Exception e)
            {
                // logger.Error(e);
            }
        }
        public void Then_SimplePropertyWithDependencyIsSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializingProperties.config", s =>
            {
                var prop = new PropertyElement()
                {
                    Name = "MyProp"
                };
                var reg = new RegisterElement()
                {
                    TypeName = "MyType"
                };
                reg.InjectionMembers.Add(prop);

                var container = new ContainerElement();
                container.Registrations.Add(reg);
                s.Containers.Add(container);
            });

            loadedSection.Containers[0].Registrations[0].InjectionMembers
            .Cast <PropertyElement>()
            .Select(p => p.Name)
            .AssertContainsExactly("MyProp");

            loadedSection.Containers[0].Registrations[0].InjectionMembers
            .Cast <PropertyElement>()
            .Select(p => p.Value.GetType())
            .AssertContainsExactly(typeof(DependencyElement));
        }
 protected override void Arrange()
 {
     base.Arrange();
     container          = Section.Containers.Default;
     firstRegistration  = container.Registrations[0];
     secondRegistration = container.Registrations[1];
     thirdRegistration  = container.Registrations[2];
 }
 protected override void Arrange()
 {
     base.Arrange();
     this.container          = this.section.Containers.Default;
     this.firstRegistration  = this.container.Registrations[0];
     this.secondRegistration = this.container.Registrations[1];
     this.thirdRegistration  = this.container.Registrations[2];
 }
        public void Then_RegistrationWithLifetimeIsSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializeContainers.config", s =>
            {
                var containerElement = new ContainerElement();

                var reg1 = new RegisterElement
                {
                    TypeName = "MyType"
                };
                var reg2 = new RegisterElement
                {
                    TypeName = "MyOtherType",
                    Lifetime = new LifetimeElement
                    {
                        TypeName = "SomeCustomLifetime",
                        Value    = "input value",
                        TypeConverterTypeName = "CustomLifetimeConverter"
                    }
                };

                var reg3 = new RegisterElement
                {
                    TypeName = "StillAnotherType",
                    Lifetime = new LifetimeElement
                    {
                        TypeName = "singleton"
                    }
                };

                containerElement.Registrations.Add(reg1);
                containerElement.Registrations.Add(reg2);
                containerElement.Registrations.Add(reg3);

                s.Containers.Add(containerElement);
            });

            var loadedReg0 = loadedSection.Containers.Default.Registrations[0];
            var loadedReg1 = loadedSection.Containers.Default.Registrations[1];
            var loadedReg2 = loadedSection.Containers.Default.Registrations[2];

            Assert.IsNotNull(loadedReg0.Lifetime);
            Assert.AreEqual(String.Empty, loadedReg0.Lifetime.TypeName);

            Assert.IsNotNull(loadedReg1.Lifetime);
            Assert.AreEqual("SomeCustomLifetime", loadedReg1.Lifetime.TypeName);
            Assert.AreEqual("input value", loadedReg1.Lifetime.Value);
            Assert.AreEqual("CustomLifetimeConverter", loadedReg1.Lifetime.TypeConverterTypeName);

            Assert.IsNotNull(loadedReg2.Lifetime);
            Assert.AreEqual("singleton", loadedReg2.Lifetime.TypeName);
            Assert.AreEqual(String.Empty, loadedReg2.Lifetime.TypeConverterTypeName);
        }
        public void Then_MultiplePropertiesWithVaryingValuesAreSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializingProperties.config", s =>
            {
                var prop = new PropertyElement()
                {
                    Name = "SimpleProp"
                };
                var prop2 = new PropertyElement
                {
                    Name  = "NamedDependencyProp",
                    Value = new DependencyElement
                    {
                        Name = "MyDep"
                    }
                };
                var prop3 = new PropertyElement
                {
                    Name  = "OptionalProp",
                    Value = new OptionalElement
                    {
                        Name     = "OptionalDep",
                        TypeName = "MyType"
                    }
                };

                var reg = new RegisterElement()
                {
                    TypeName = "MyType"
                };
                reg.InjectionMembers.Add(prop);
                reg.InjectionMembers.Add(prop2);
                reg.InjectionMembers.Add(prop3);

                var container = new ContainerElement();
                container.Registrations.Add(reg);
                s.Containers.Add(container);
            });

            var propertyElements = loadedSection.Containers[0].Registrations[0].InjectionMembers.Cast <PropertyElement>();

            propertyElements.Select(p => p.Name)
            .AssertContainsExactly("SimpleProp", "NamedDependencyProp", "OptionalProp");

            propertyElements.Select(p => p.Value.GetType())
            .AssertContainsExactly(typeof(DependencyElement), typeof(DependencyElement), typeof(OptionalElement));

            Assert.AreEqual("MyDep",
                            ((DependencyElement)propertyElements.Where(p => p.Name == "NamedDependencyProp").First().Value).Name);
        }
        public void Then_MethodsGetSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializingMethods.config", s =>
            {
                var method0 = new MethodElement
                {
                    Name = "NoArgsMethod"
                };

                var method1 = new MethodElement
                {
                    Name = "OneArgMethod"
                };

                method1.Parameters.Add(new ParameterElement
                {
                    Name = "BasicDependency"
                });
                method1.Parameters.Add(new ParameterElement
                {
                    Name  = "ArrayDependency",
                    Value = new ArrayElement
                    {
                        TypeName = "SomeType"
                    }
                });

                var reg = new RegisterElement
                {
                    TypeName = "MyType"
                };
                reg.InjectionMembers.Add(method0);
                reg.InjectionMembers.Add(method1);
                var container = new ContainerElement();
                container.Registrations.Add(reg);
                s.Containers.Add(container);
            });

            var methods = loadedSection.Containers.Default.Registrations[0].InjectionMembers.Cast <MethodElement>();

            methods.Select(m => m.Name)
            .AssertContainsExactly("NoArgsMethod", "OneArgMethod");

            var oneArgMethod = methods.Where(m => m.Name == "OneArgMethod").First();

            Assert.AreEqual(2, oneArgMethod.Parameters.Count);
        }
        protected override void Arrange()
        {
            base.Arrange();

            var ctor = new ConstructorElement();

            ctor.Parameters.Add(
                new ParameterElement
            {
                Name  = "dependencyParameter",
                Value = new DependencyElement {
                    Name = "dep1"
                }
            });

            ctor.Parameters.Add(
                new ParameterElement
            {
                Name  = "valueParameter",
                Value = new ValueElement
                {
                    Value = "123",
                    TypeConverterTypeName = "IntConverter"
                }
            });

            ctor.Parameters.Add(
                new ParameterElement
            {
                Name  = "optionalParameter",
                Value = new OptionalElement()
            });

            var registration = new RegisterElement
            {
                TypeName = "MyType"
            };

            registration.InjectionMembers.Add(ctor);

            var container = new ContainerElement();

            container.Registrations.Add(registration);

            Section = new UnityConfigurationSection();
            Section.Containers.Add(container);
        }
        public void Then_InterceptorGetsSerialized()
        {
            var loadedSection = SerializeAndLoadConfig("SerializingInjectionMembers.config", c =>
            {
                var reg = new RegisterElement()
                {
                    TypeName = "SomeType"
                };

                reg.InjectionMembers.Add(new InterceptorElement()
                {
                    Name     = "interceptor",
                    TypeName = "NoSuchInterceptor"
                });

                var reg2 = new RegisterElement()
                {
                    TypeName = "SomeType",
                    Name     = "Default"
                };

                reg2.InjectionMembers.Add(new InterceptorElement()
                {
                    IsDefaultForType = true,
                    Name             = "otherInterceptor",
                    TypeName         = "AnotherInterceptor"
                });

                c.Registrations.Add(reg);
                c.Registrations.Add(reg2);
            });

            var firstInterceptor =
                (InterceptorElement)loadedSection.Containers.Default.Registrations[0].InjectionMembers[0];

            Assert.IsFalse(firstInterceptor.IsDefaultForType);
            Assert.AreEqual("interceptor", firstInterceptor.Name);
            Assert.AreEqual("NoSuchInterceptor", firstInterceptor.TypeName);

            var secondInterceptor =
                (InterceptorElement)loadedSection.Containers.Default.Registrations[1].InjectionMembers[0];

            Assert.IsTrue(secondInterceptor.IsDefaultForType);
            Assert.AreEqual("otherInterceptor", secondInterceptor.Name);
            Assert.AreEqual("AnotherInterceptor", secondInterceptor.TypeName);
        }
        /// <summary>
        ///     생성자에 대한 역직렬화를 수행합니다.
        /// </summary>
        /// <param name="element">	컨테이너 요소입니다. </param>
        /// <returns>IoC 컨테이너가 제공하는 생성자에 대한 객체 입니다.</returns>
        protected override object ResolveConstructor(RegisterElement element)
        {
            List <object> paramList = new List <object>();

            foreach (var p in element.constructor)
            {
                var obj = this.ResolveParam(p.name, p.Item);
                if (obj is DynamicParametersDelegate)
                {
                    paramList.Add(obj);
                }
                else
                {
                    paramList.Add(Parameter.ForKey(p.name).Eq(obj.ToString()));
                }
            }

            return(paramList);
        }
        protected override void Arrange()
        {
            base.Arrange();

            var ctor = new ConstructorElement();
            ctor.Parameters.Add(
                new ParameterElement
                {
                    Name = "dependencyParameter",
                    Value = new DependencyElement {Name = "dep1"}
                });

            ctor.Parameters.Add(
                new ParameterElement
                {
                    Name = "valueParameter",
                    Value = new ValueElement
                    {
                        Value = "123",
                        TypeConverterTypeName = "IntConverter"
                    }
                });

            ctor.Parameters.Add(
                new ParameterElement
                {
                    Name = "optionalParameter",
                    Value = new OptionalElement()
                });

            var registration = new RegisterElement
            {
                TypeName = "MyType"
            };

            registration.InjectionMembers.Add(ctor);

            var container = new ContainerElement();
            container.Registrations.Add(registration);

            Section = new UnityConfigurationSection();
            Section.Containers.Add(container);
        }
        public void Then_AdditionalInterfacesGetSerialized()
        {
            var loadedSection = SerializeAndLoadConfig("SerializingInjectionMembers.config", c =>
            {
                var reg = new RegisterElement
                {
                    TypeName = "SomeType"
                };

                reg.InjectionMembers.Add(new AddInterfaceElement()
                {
                    TypeName = "InterfaceOne"
                });

                c.Registrations.Add(reg);
            });

            var additionalInterface = (AddInterfaceElement)
                                      loadedSection.Containers.Default.Registrations[0].InjectionMembers[0];

            Assert.AreEqual("InterfaceOne", additionalInterface.TypeName);
        }
        private static void FillSectionWithConstructors(UnityConfigurationSection s)
        {
            var zeroArgCtor = new ConstructorElement();
            var intCtor     = new ConstructorElement();

            intCtor.Parameters.Add(new ParameterElement
            {
                Name  = "intParam",
                Value = new ValueElement
                {
                    Value = "23"
                }
            });

            var zeroArgRegistration = new RegisterElement
            {
                TypeName = "SomeType",
                Name     = "zeroArg"
            };

            zeroArgRegistration.InjectionMembers.Add(zeroArgCtor);

            var oneArgRegistration = new RegisterElement
            {
                TypeName = "SomeType",
                Name     = "oneArg"
            };

            oneArgRegistration.InjectionMembers.Add(intCtor);

            var container = new ContainerElement();

            container.Registrations.Add(zeroArgRegistration);
            container.Registrations.Add(oneArgRegistration);
            s.Containers.Add(container);
        }
        public void Then_SectionWithExtendedInjectionmemberElementsIsSerialized()
        {
            var loadedSection = SerializeAndLoadSection("SerializingExtensionElements.config", s =>
            {
                var registration = new RegisterElement
                {
                    TypeName = "string"
                };
                registration.InjectionMembers.Add(new TestInjectionMemberElement());

                var container = new ContainerElement();
                container.Registrations.Add(registration);
                s.Containers.Add(container);
                s.SectionExtensions.Add(new SectionExtensionElement
                {
                    TypeName = typeof(TestSectionExtension).AssemblyQualifiedName,
                    Prefix   = "pre1"
                });
            });

            loadedSection.Containers.Default.Registrations[0].InjectionMembers
            .Select(i => i.GetType())
            .AssertContainsExactly(typeof(TestInjectionMemberElement));
        }
 public bool SearchByName(string name, out RegisterElement res)
 {
     res = Array.Find(Registers, (e) => e.IsMatchByName(name));
     return(res.Name != null);
 }
 /// <summary>
 ///     생성자에 대한 역직렬화를 수행합니다.
 /// </summary>
 /// <param name="element">	컨테이너 요소입니다. </param>
 /// <returns>IoC 컨테이너가 제공하는 생성자에 대한 객체 입니다.</returns>
 protected override object ResolveConstructor(RegisterElement element)
 {
     return(new InjectionConstructor(this.ResolveParams(element.constructor).ToArray()));
 }
Example #20
0
 private static bool IsInterceptableType(RegisterElement element)
 {
     return(element.TypeName == "Interceptable");
 }
        private void BuildConfigWithValues(UnityConfigurationSection s)
        {
            var ctorElement = new ConstructorElement();

            ctorElement.Parameters.Add(new ParameterElement
            {
                Name = "defaultDependency"
            });
            ctorElement.Parameters.Add(new ParameterElement
            {
                Name  = "namedDependency",
                Value = new DependencyElement
                {
                    Name = "someName"
                }
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "typedDependency",
                Value = new DependencyElement()
                {
                    TypeName = "SomeOtherType"
                }
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "valueDependency",
                Value = new ValueElement
                {
                    Value = "someValue"
                }
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "valueWithTypeConverter",
                Value = new ValueElement
                {
                    Value = "someValue",
                    TypeConverterTypeName = "MyConverter"
                }
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "optionalValue",
                Value = new OptionalElement()
                {
                    Name     = "dependencyKey",
                    TypeName = "DependencyType"
                }
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "emptyArrayValue",
                Value = new ArrayElement()
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "typedEmptyArrayValue",
                Value = new ArrayElement
                {
                    TypeName = "MyElementType"
                }
            });
            var arrayWithValues = new ArrayElement();

            arrayWithValues.Values.Add(new DependencyElement());
            arrayWithValues.Values.Add(new ValueElement()
            {
                Value = "something"
            });
            arrayWithValues.Values.Add(new DependencyElement()
            {
                Name = "dependencyName"
            });
            ctorElement.Parameters.Add(new ParameterElement()
            {
                Name  = "arrayWithValues",
                Value = arrayWithValues
            });

            var registration = new RegisterElement
            {
                TypeName = "someType"
            };

            registration.InjectionMembers.Add(ctorElement);

            var container = new ContainerElement();

            container.Registrations.Add(registration);
            s.Containers.Add(container);
        }
 /// <summary>
 ///     생성자에 대한 역직렬화를 수행합니다.
 /// </summary>
 /// <param name="element">	컨테이너 요소입니다. </param>
 /// <returns>IoC 컨테이너가 제공하는 생성자에 대한 객체 입니다.</returns>
 protected abstract object ResolveConstructor(RegisterElement element);
 public bool SearchByOperand(int num, int index, out RegisterElement res)
 {
     res = Array.Find(Registers, (e) => e.IsMatchByOperand(num, index));
     return(res.Name != null);
 }
 /// <summary>
 ///     IoC 컨테이너가 제공하는 객체 처리를 수행합니다.
 /// </summary>
 /// <param name="element">	    컨테이너 요소입니다. </param>
 /// <param name="lifetime">	    The lifetime. </param>
 /// <param name="constructor">  역직렬화된 생성자 요소입니다.</param>
 /// <param name="properties">   역직렬화된 속성(Property) 요소입니다.</param>
 /// <param name="methods">      역직렬화된 메서드 요소입니다.</param>
 protected abstract void ResolveRegisterProcessor(RegisterElement element, LifetimeFlag lifetime, IEnumerable <object> constructor, IEnumerable <object> properties, IEnumerable <object> methods);