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
浙公网安备 33010602011771号