ObjectBuilder分析13

构造函数依赖注入实现(ObjectBuilder)

调试代码段:
   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();
        }

    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>
        /// 第一种:ValueParameter参数调用方法
        /// </summary>
        /// <param name="context"></param>
         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);
        }


调试流程:

1, MyBuilderContext context = new MyBuilderContext(new Locator()); 工作如下:

//初始化空的弱引用对象和空的只读存储器
Locator--〉WeakRefDictionary;IReadableLocator

//初始化空的策略列表
BuilderStrategyChain--〉List<IBuilderStrategy>

//初始化空的方针例表
PolicyList(政策KEY)--〉
 object lockObject = new object();
 Dictionary<BuilderPolicyKey, IBuilderPolicy> policies :<对象(方针表的容器),ID(方针的接口)>

//初始化空的生命周期容器
LifetimeContainer-->
 List<object> items = new List<object>();

//初始化为0的下面三项
BuilderContext--〉
IReadWriteLocator(定位器)
IReadWriteLocator(策略链)
PolicyList policies(方针列表)

//定位器中没有此生命周期,
//就添加到弱引用字典中:
//WeakRefDictionary--〉Dictionary<TKey, WeakReference> inner = new Dictionary<TKey, WeakReference>()中。
 if (!Locator.Contains(typeof(ILifetimeContainer)))
                Locator.Add(typeof(ILifetimeContainer), lifetimeContainer);

2,context.InnerChain.Add(new CreationStrategy()); 工作如下:

//添加了一个创建策略到策略列表中
BuilderStrategyChain--〉Add(..)==List<IBuilderStrategy> strategies.CreationStrategy对象

3,UseValueParameter(MyBuilderContext context)工作如下:

//方针对象中初始化0的参数
ConstructorPolicy--〉List<IParameter> parameters

//方针对象的参数列表中添加了一个参数对象
 creationPolicy.AddParameter(new ValueParameter(typeof(IDataProcessor), new PromptDataProcessor()));


//方针列表的字典字段中添加一个方针对象
//〈策略类型(ConstructorPolicy策略,InputAccept主接口类),方针对象(creationPolicy主接口包含的子接口及子接口的子方法)〉
PolicyList--〉Dictionary<BuilderPolicyKey, IBuilderPolicy> policies


4,InputAccept accept = (InputAccept)context.HeadOfChain.BuildUp(context, typeof(InputAccept), null, null); 工作如下:

//取出之前的方针对象(子接口及子接口中方法)
ICreationPolicy policy = context.Policies.Get<ICreationPolicy>(typeToBuild, idToBuild);

//实例化主接口实列
object existing = FormatterServices.GetSafeUninitializedObject(typeToBuild);//typeToBuild是InputAccept主接口类的Type类型

//注册生命周期
CreationStrategy--〉RegisterObject

//最终创建对象
CreationStrategy--〉InitializeObject


 

posted on 2011-04-14 16:06  netyaya  阅读(205)  评论(0)    收藏  举报

导航