ObjectBuilder分析2

objectBuilder中Parameter各类型的应用:

 public class MyBuilderContext : BuilderContext
    {
        public IReadWriteLocator InnerLocator;
        public BuilderStrategyChain InnerChain = new BuilderStrategyChain();
        public PolicyList InnerPolicies = new PolicyList();
        public LifetimeContainer lifetimeContainer = new LifetimeContainer();

        public MyBuilderContext()
            : this(new Locator())
        {
        }

        public MyBuilderContext(IReadWriteLocator locator)
        {
            InnerLocator = locator;
            base.SetLocator(InnerLocator);
            base.StrategyChain = InnerChain;
            base.SetPolicies(InnerPolicies);

            if (!Locator.Contains(typeof(ILifetimeContainer)))
                Locator.Add(typeof(ILifetimeContainer), lifetimeContainer);
        }
    }

     /// <summary>
    /// 程序于一开始时,建立了一个MyBuilderContext对象,
    /// 1,会自行建立BuilderContext对象而不使用Builder对象的目的很单纯,
    /// 就是为了厘清个别Strategy究竟做了那些事,这点在使用Builder对象时,
    /// 会因为内建的Strategy都已加入,而显得有些模糊。
    /// 2,在MyBuilderContext对象建立后,此处将一个CreationStrategy加到Strategy串行中,
    /// CreationStrategy这个Strategy被归类为Creation阶段,是真正建立对象的Strategy,
    /// 3,紧接着UseValueParameter方法会被调用,这个方法中建立了一个ConstructorPolicy对象,
    /// 4,并调用其AddParameter方法,加入一个ValueParameter对象,
    /// 这个ValueParameter对象就对应着InputAccept的构造函数所需的参数,
    /// CreationStrategy于对象建立后,
    /// 5,会透过BuilderContext的Policies来取得『类型/id』对应的ICreationPolicy对象(本例就是ConstructorPolicy对象),
    /// 然后调用ICreationPolicy.SelectionConstructor方法,
    /// 这个方法必须根据调用者已用ICreationPolicy.AddParameter所传入的参数来选择正确的构造函数,
    /// 然后再调用这个构造函数并填入参数值来完成对象建立工作,
    /// </summary>
        static void Main(string[] args)
        {
            MyBuilderContext context = new MyBuilderContext(new Locator());
            context.InnerChain.Add(new CreationStrategy());
            UseValueParameter(context);
            InputAccept accept = (InputAccept)context.HeadOfChain.BuildUp(context, typeof(InputAccept), null, null);
            accept.Execute();
            Console.Read();
        }

  //第一种:ValueParameter参数调用方法
         static void UseValueParameter(MyBuilderContext context)
        {
            ConstructorPolicy creationPolicy = new ConstructorPolicy();
            creationPolicy.AddParameter(new ValueParameter(typeof(IDataProcessor), new PromptDataProcessor()));
            context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);
        }


        //第二种:DependencyParameter参数调用方法
         static void UseDependencyParameter(MyBuilderContext context)
         {
             ConstructorPolicy creationPolicy = new ConstructorPolicy();
             creationPolicy.AddParameter(new DependencyParameter(typeof(IDataProcessor), null,
                typeof(PromptDataProcessor), NotPresentBehavior.CreateNew, SearchMode.Local));

             context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);

             //为每个『类型/id』都要设定对应的ICreationPolicy方针,可更改为第四种方法的SetDefault方法。
             ConstructorPolicy creationPolicy2 = new ConstructorPolicy();
             context.Policies.Set<ICreationPolicy>(creationPolicy2, typeof(PromptDataProcessor), null);
         }


         //第三种解说 DependencyParameter参数对象和Locator关系的方法
         static void UseDependencyParameter(MyBuilderContext context)
         {
             //说明Locator的作用
             //预先建立了一个PromptDataProcessor对象,并以DependencyResolutionLocatorKey封装后推入Locator中,
             //这样一来,当DependencyParameter取值时,就会依据参数的『类型/id』至Locator找寻需要的值,
             //此时就会得到我们所推入的PromptDataProcessor对象,而不是建立一个新的,
             //另外!只要于AddParameter所传入的DependencyParameter是以IDataProcessor为参数类型,
             //并以null为id(名称)的话,那么永远都会传回我们所推入Locator的PromptDataProcessor 对象
             context.InnerLocator.Add(new DependencyResolutionLocatorKey(typeof(IDataProcessor), null),
                 new PromptDataProcessor());

             ConstructorPolicy creationPolicy = new ConstructorPolicy();
             creationPolicy.AddParameter(new DependencyParameter(typeof(IDataProcessor), null,
                 typeof(PromptDataProcessor), NotPresentBehavior.CreateNew, SearchMode.Local));
             context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);

             //为每个『类型/id』都要设定对应的ICreationPolicy方针,可更改为第四种方法的SetDefault方法。
             ConstructorPolicy creationPolicy2 = new ConstructorPolicy();
             context.Policies.Set<ICreationPolicy>(creationPolicy2, typeof(PromptDataProcessor), null);
         }


         //第四种:说明默认提供的SetDefault方法
         static void UseDependencyParameter(MyBuilderContext context)
         {
             ConstructorPolicy creationPolicy = new ConstructorPolicy();
             creationPolicy.AddParameter(new DependencyParameter(typeof(IDataProcessor),
                 null, typeof(PromptDataProcessor), NotPresentBehavior.CreateNew, SearchMode.Local));
             context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);

             //调用Policies.SetDefault来为所有『类型/id』预设一个ICreationPolicy
             context.Policies.SetDefault<ICreationPolicy>(new ConstructorPolicy());
         }

------------------------------------------------------------------------------------------------------------

static void Main(string[] args)
        {
            MyBuilderContext context = new MyBuilderContext(new Locator());
            context.InnerChain.Add(new TypeMappingStrategy());
            context.InnerChain.Add(new CreationStrategy());
            UseCreationParameter(context);
            InputAccept accept = (InputAccept)context.HeadOfChain.BuildUp(context,
                typeof(InputAccept), null, null);
            accept.Execute();
            Console.Read();
        }

   /// <summary>第五种
        /// 与DependencyParameter相同,CreationParameter也会透过BuildUp来建立对象,
        /// 不同的是其不会先搜寻Locator,也无法作参数类型与实体类型对应,
        /// 因此无法适用以接口为介质的注入方式,
        /// 必须与TypeMappingStrategy合用才能解决
        /// </summary>
        /// <param name="context"></param>
        static void UseCreationParameter(MyBuilderContext context)
        {
            ConstructorPolicy creationPolicy = new ConstructorPolicy();
            creationPolicy.AddParameter(new CreationParameter(typeof(IDataProcessor)));
            context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);

            TypeMappingPolicy mappingPolicy = new TypeMappingPolicy(typeof(PromptDataProcessor), null);
            context.Policies.Set<ITypeMappingPolicy>(mappingPolicy, typeof(IDataProcessor), null);

            context.Policies.SetDefault<ICreationPolicy>(new ConstructorPolicy());
        }


        /// <summary>第六种
        /// LookupParameter对象的使用方法
        /// 接受一个object类型的参数,当GetValue方法被调用时,
        /// 会经由Locator.Get方法,以构造函数所传入的参数为键值,取得位于Locator中的值
        /// </summary>
        /// <param name="context"></param>
        static void UseLookupParameter(MyBuilderContext context)
        {
            context.InnerLocator.Add("dataProcessor", new PromptDataProcessor());
            ConstructorPolicy creationPolicy = new ConstructorPolicy();
            creationPolicy.AddParameter(new LookupParameter("dataProcessor"));
            context.Policies.Set<ICreationPolicy>(creationPolicy, typeof(InputAccept), null);
            context.Policies.SetDefault<ICreationPolicy>(new ConstructorPolicy());
        }

posted on 2011-04-13 12:27  netyaya  阅读(191)  评论(0)    收藏  举报

导航