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); }
/// <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); } } }
/// <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); }
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); }
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); }
/// <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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }