Пример #1
0
        public void CreateComplexObject()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();

            ConstructorPolicy policy = new ConstructorPolicy();

            policy.AddParameter(new ValueParameter <int>(12));
            builder.Policies.Set <ICreationPolicy>(policy, typeof(SimpleObject), null);

            ConstructorPolicy policy2 = new ConstructorPolicy();

            policy2.AddParameter(new CreationParameter(typeof(SimpleObject)));
            builder.Policies.Set <ICreationPolicy>(policy2, typeof(ComplexObject), null);

            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(SimpleObject), null);
            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(ComplexObject), null);

            ComplexObject cm = builder.BuildUp <ComplexObject>(locator, null, null);
            SimpleObject  m  = builder.BuildUp <SimpleObject>(locator, null, null);

            Assert.AreSame(m, cm.SimpleObject);
            Assert.IsNotNull(cm);
            Assert.IsNotNull(cm.SimpleObject);
            Assert.AreEqual(12, cm.SimpleObject.IntParam);
        }
Пример #2
0
        /// <summary>
        /// 根据配置文件的设置, 将构造原则(IPolicy)实例添加至Builder对象的构造原则链中.
        /// </summary>
        /// <param name="configSection">配置文件对象.</param>
        /// <param name="builder">Builder对象</param>
        private void applyConfigurationToBuilder(FactoryConfigurationSection configSection, IBuilder <BuilderStage> builder)
        {
            foreach (InterfaceElement interfaceEle in configSection.Interfaces)
            {
                foreach (InstanceElement instanceEle in interfaceEle.Instances)
                {
                    // 添加接口与实现的Map关系!!
                    TypeMappingPolicy tmp = new TypeMappingPolicy(instanceEle.Type, instanceEle.Name);
                    builder.Policies.Set <ITypeMappingPolicy>(tmp, interfaceEle.Type, instanceEle.Name);

                    // 添加接口实例的构造原则(IPolicy)(添加实例构造函数的参数列表).
                    List <IParameter> paras = new List <IParameter>();
                    foreach (ConstructorParameterElement conParaEle in instanceEle.ConstructorParameters)
                    {
                        paras.Add(new ValueParameter(conParaEle.Type, conParaEle.GetParameterValue()));
                    }

                    ConstructorPolicy csp = new ConstructorPolicy(paras.ToArray());
                    builder.Policies.Set <ICreationPolicy>(csp, instanceEle.Type, instanceEle.Name);

                    // 添加是否单件的构造原则(IPolicy).
                    SingletonPolicy slp = new SingletonPolicy(instanceEle.IsSingleton);
                    builder.Policies.Set <ISingletonPolicy>(slp, instanceEle.Type, instanceEle.Name);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 构建策略
        /// </summary>
        /// <param name="servicedesc">服务描述</param>
        /// <param name="issave">是否保存服务</param>
        /// <param name="parameters">服务传入参数</param>
        /// <returns></returns>
        public PolicyList[] BuildPolicy(ServiceDesc servicedesc, bool issave, object[] parameters)
        {
            PolicyList[] policies   = new PolicyList[1];
            PolicyList   policylist = new PolicyList();

            policies[0] = policylist;

            //构建影射策略
            TypeMappingPolicy typepolicy = new TypeMappingPolicy(servicedesc.ImpleType, servicedesc.Key);

            policylist.Set <ITypeMappingPolicy>(typepolicy, servicedesc.ServiceType, servicedesc.Key);

            //构建单一构建策略(只有创建了单一创建策略才能够Locate)
            if (issave)
            {
                SingletonPolicy singletonpolicy = new SingletonPolicy(true);
                policylist.Set <ISingletonPolicy>(singletonpolicy, servicedesc.ImpleType, servicedesc.Key);
            }

            //建立创建策略,可以添加参数
            if (parameters != null && parameters.Length != 0)
            {
                ConstructorPolicy constuctorpolicy = new ConstructorPolicy();
                for (int i = 0; i < parameters.Length; i++)
                {
                    constuctorpolicy.AddParameter(new ValueParameter(parameters[i].GetType(), parameters[i]));
                }
                policylist.Set <ICreationPolicy>(constuctorpolicy, servicedesc.ImpleType, servicedesc.Key);
            }
            return(policies);
        }
Пример #4
0
        public void RefParamsCanAskForSpecificallyNamedObjects()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();

            ConstructorPolicy policy1 = new ConstructorPolicy();

            policy1.AddParameter(new ValueParameter <int>(12));
            builder.Policies.Set <ICreationPolicy>(policy1, typeof(SimpleObject), "Object1");
            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(SimpleObject), "Object1");

            ConstructorPolicy policy2 = new ConstructorPolicy();

            policy2.AddParameter(new ValueParameter <int>(32));
            builder.Policies.Set <ICreationPolicy>(policy2, typeof(SimpleObject), "Object2");
            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(SimpleObject), "Object2");

            ConstructorPolicy policy3 = new ConstructorPolicy();

            policy3.AddParameter(new CreationParameter(typeof(SimpleObject), "Object2"));
            builder.Policies.Set <ICreationPolicy>(policy3, typeof(ComplexObject), null);
            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(ComplexObject), null);

            ComplexObject cm = builder.BuildUp <ComplexObject>(locator, null, null);
            SimpleObject  sm = builder.BuildUp <SimpleObject>(locator, "Object2", null);

            Assert.IsNotNull(cm);
            Assert.IsNotNull(cm.SimpleObject);
            Assert.AreEqual(32, cm.SimpleObject.IntParam);
            Assert.AreSame(sm, cm.SimpleObject);
        }
		public void GetConstructorReturnsTheCorrectOneWhenParamsPassedThruCtor()
		{
			ConstructorPolicy policy = new ConstructorPolicy(new ValueParameter<int>(5));

			ConstructorInfo actual = policy.SelectConstructor(new MockBuilderContext(), typeof(MockObject), null);
			ConstructorInfo expected = typeof(MockObject).GetConstructors()[1];

			Assert.AreSame(expected, actual);
		}
        public void GetConstructorReturnsTheCorrectOneWhenParamsPassedThruCtor()
        {
            ConstructorPolicy policy = new ConstructorPolicy(new ValueParameter <int>(5));

            ConstructorInfo actual   = policy.SelectConstructor(new MockBuilderContext(), typeof(MockObject), null);
            ConstructorInfo expected = typeof(MockObject).GetConstructors()[1];

            Assert.AreSame(expected, actual);
        }
        public void IncompatibleTypesThrows()
        {
            MockBuilderContext ctx       = CreateContext();
            ILifetimeContainer container = ctx.Locator.Get <ILifetimeContainer>();
            ConstructorInfo    ci        = typeof(MockObject).GetConstructor(new Type[] { typeof(int) });
            ICreationPolicy    policy    = new ConstructorPolicy(ci, new ValueParameter <string>(String.Empty));

            ctx.Policies.Set <ICreationPolicy>(policy, typeof(MockObject), null);

            object obj = ctx.HeadOfChain.BuildUp(ctx, typeof(MockObject), null, null);
        }
Пример #8
0
        public void CanAddPoliciesToBuilderForTypeAndID()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();
            ConstructorPolicy policy = new ConstructorPolicy();
            policy.AddParameter(new ValueParameter<int>(14));
            builder.Policies.Set<ICreationPolicy>(policy, typeof(MockObject), "foo");

            MockObject obj = builder.BuildUp<MockObject>(locator, "foo", null);

            Assert.IsNotNull(obj);
            Assert.AreEqual(14, obj.IntValue);
        }
Пример #9
0
        /// <summary>
        /// See <see cref="ReflectionStrategy{T}.AddParametersToPolicy"/> for more information.
        /// </summary>
        protected override void AddParametersToPolicy(IBuilderContext context, Type typeToBuild, string idToBuild,
                                                      IReflectionMemberInfo <ConstructorInfo> member,
                                                      IEnumerable <IParameter> parameters)
        {
            ConstructorPolicy policy = new ConstructorPolicy();

            foreach (IParameter parameter in parameters)
            {
                policy.AddParameter(parameter);
            }

            context.Policies.Set <ICreationPolicy>(policy, typeToBuild, idToBuild);
        }
Пример #10
0
        public void CanAddPoliciesToBuilderForTypeAndID()
        {
            Builder           builder = new Builder();
            Locator           locator = CreateLocator();
            ConstructorPolicy policy  = new ConstructorPolicy();

            policy.AddParameter(new ValueParameter <int>(14));
            builder.Policies.Set <ICreationPolicy>(policy, typeof(MockObject), "foo");

            MockObject obj = builder.BuildUp <MockObject>(locator, "foo", null);

            Assert.IsNotNull(obj);
            Assert.AreEqual(14, obj.IntValue);
        }
Пример #11
0
        public void CanCreateSingleton()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();

            ConstructorPolicy policy = new ConstructorPolicy();

            policy.AddParameter(new ValueParameter <int>(12));
            builder.Policies.Set <ICreationPolicy>(policy, typeof(SimpleObject), null);
            builder.Policies.Set <ISingletonPolicy>(new SingletonPolicy(true), typeof(SimpleObject), null);

            SimpleObject m1 = builder.BuildUp <SimpleObject>(locator, null, null);
            SimpleObject m2 = builder.BuildUp <SimpleObject>(locator, null, null);

            Assert.AreSame(m1, m2);
        }
Пример #12
0
        private void ProcessConstructor(BuildRuleElement buildRule, Type buildType)
        {
            if (buildRule.Constructor == null)
            {
                return;
            }

            ConstructorPolicy policy = new ConstructorPolicy();

            foreach (object param in buildRule.Constructor.Items)
            {
                policy.AddParameter(GetParameterFromConfigParam(param));
            }

            builder.Policies.Set <ICreationPolicy>(policy, buildType, null);
        }
Пример #13
0
        public void CanCreateInstances()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();

            ConstructorPolicy policy = new ConstructorPolicy();

            policy.AddParameter(new ValueParameter <int>(12));
            builder.Policies.Set <ICreationPolicy>(policy, typeof(SimpleObject), null);

            SimpleObject m1 = builder.BuildUp <SimpleObject>(locator, null, null);
            SimpleObject m2 = builder.BuildUp <SimpleObject>(locator, null, null);

            Assert.IsNotNull(m1);
            Assert.IsNotNull(m2);
            Assert.AreEqual(12, m1.IntParam);
            Assert.AreEqual(12, m2.IntParam);
            Assert.IsTrue(m1 != m2);
        }
Пример #14
0
        public void CanCreateNamedConcreteObjectByAskingForNamedInterface()
        {
            Builder           builder = new Builder();
            ConstructorPolicy policy  = new ConstructorPolicy(new ValueParameter <int>(12));

            builder.Policies.Set <ICreationPolicy>(policy, typeof(SimpleObject), "Foo");
            builder.Policies.Set <ITypeMappingPolicy>(new TypeMappingPolicy(typeof(SimpleObject), null), typeof(ISimpleObject), null);
            builder.Policies.Set <ITypeMappingPolicy>(new TypeMappingPolicy(typeof(SimpleObject), "Foo"), typeof(ISimpleObject), "sm2");
            Locator locator = CreateLocator();

            ISimpleObject sm1 = builder.BuildUp <ISimpleObject>(locator, null, null);
            ISimpleObject sm2 = builder.BuildUp <ISimpleObject>(locator, "sm2", null);

            Assert.IsNotNull(sm1);
            Assert.IsNotNull(sm2);
            Assert.IsTrue(sm1 is SimpleObject);
            Assert.IsTrue(sm2 is SimpleObject);
            Assert.AreEqual(0, ((SimpleObject)sm1).IntParam);
            Assert.AreEqual(12, ((SimpleObject)sm2).IntParam);
        }
Пример #15
0
        public void CanInjectMultiplePropertiesIncludingCreatedObjects()
        {
            Builder builder = new Builder();
            Locator locator = CreateLocator();

            ConstructorPolicy policy = new ConstructorPolicy();

            policy.AddParameter(new ValueParameter <int>(15));
            builder.Policies.Set <ICreationPolicy>(policy, typeof(SimpleObject), null);

            PropertySetterPolicy policy1 = new PropertySetterPolicy();

            policy1.Properties.Add("StringProperty", new PropertySetterInfo("StringProperty", new ValueParameter <string>("Bar is here")));
            policy1.Properties.Add("SimpleObject", new PropertySetterInfo("SimpleObject", new CreationParameter(typeof(SimpleObject))));
            builder.Policies.Set <IPropertySetterPolicy>(policy1, typeof(ComplexObject), null);

            ComplexObject co = builder.BuildUp <ComplexObject>(locator, null, null);

            Assert.IsNotNull(co);
            Assert.IsNotNull(co.SimpleObject);
            Assert.AreEqual("Bar is here", co.StringProperty);
            Assert.AreEqual(15, co.SimpleObject.IntParam);
        }
Пример #16
0
        public void IncompatibleTypesThrows()
        {
            MockBuilderContext ctx = CreateContext();
            ILifetimeContainer container = ctx.Locator.Get<ILifetimeContainer>();
            ConstructorInfo ci = typeof(MockObject).GetConstructor(new Type[] { typeof(int) });
            ICreationPolicy policy = new ConstructorPolicy(ci, new ValueParameter<string>(String.Empty));
            ctx.Policies.Set<ICreationPolicy>(policy, typeof(MockObject), null);

            object obj = ctx.HeadOfChain.BuildUp(ctx, typeof(MockObject), null, null);
        }