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());
}
浙公网安备 33010602011771号