[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(一)

ObjectBuilder之创建策略祥解()        

                                                                      Written by 浪子 [walkingboy.cnblogs.com]    

前言:

 

ObjectBuilder已经默认制定了很多创建策略,可能看到这么多策略加上整个地方架构满天飞,反而搞不清楚如何去应用ObjectBuilder创建我们需要的对象了。研究它的原理只是为了更好的发挥它的功效,本系列将详细解析ObjectBuilder中的所有默认创建策略的原理以及应用:

 

 

1、类型映射策略(TypeMappingStrategy)


   上文 讲过,策略的具体行为都是由他们各自所对应的方针来决定的。类型映射策略也有其映射方针:


   r_TypeMappingPolicy.png

   方针规范(
ITypeMappingPolicy):


None.gif public   interface  ITypeMappingPolicy : IBuilderPolicy
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// Maps one Type/ID pair to another.
InBlock.gif    
/// </summary>
InBlock.gif    
/// <param name="incomingTypeIDPair">The incoming Type/ID pair.</param>
ExpandedSubBlockEnd.gif    
/// <returns>The new Type/ID pair.返回映射后的对象类型&标识</returns>

InBlock.gif    DependencyResolutionLocatorKey Map(DependencyResolutionLocatorKey incomingTypeIDPair);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif

 

 

 

   具体方针(TypeMappingPolicy):

 

     
     

None.gif public   class  TypeMappingPolicy : ITypeMappingPolicy
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private DependencyResolutionLocatorKey pair;
InBlock.gif     
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// Initializes a new instance of the <see cref="TypeMappingPolicy"/> class using
InBlock.gif    
/// the provided type and ID.
InBlock.gif    
/// </summary>
InBlock.gif    
/// <param name="type">要翻译的对象类型</param>
ExpandedSubBlockEnd.gif    
/// <param name="id">The new ID to be returned during Map.</param>

InBlock.gif    public TypeMappingPolicy(Type type, string id)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        pair 
= new DependencyResolutionLocatorKey(type, id);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// See <see cref="ITypeMappingPolicy.Map"/> for more information.
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public DependencyResolutionLocatorKey Map(DependencyResolutionLocatorKey incomingTypeIDPair)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return pair;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif



 

创建策略中的类型映射应用:

 

       

None.gif public   override   object  BuildUp(IBuilderContext context, Type t,  object  existing,  string  id)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//要创建的对象类型DependencyResolutionLocatorKey
InBlock.gif
    DependencyResolutionLocatorKey result = new DependencyResolutionLocatorKey(t, id);
InBlock.gif
InBlock.gif    
//按照创建的对象类型和标识查询上下文中的映射方针
InBlock.gif
    ITypeMappingPolicy policy = context.Policies.Get<ITypeMappingPolicy>(t, id);
InBlock.gif
InBlock.gif    
if (policy != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//将方针中的翻译对象映射给result
InBlock.gif
        result = policy.Map(result);
InBlock.gif
InBlock.gif        
//记录BuildUp日志
InBlock.gif
         TraceBuildUp(context, t, id, Properties.Resources.TypeMapped, result.Type, result.ID ?? "(null)");
InBlock.gif
InBlock.gif        
//检测是否能正常转换这两个类型
InBlock.gif
         Guard.TypeIsAssignableFromType(t, result.Type, t);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif                     
InBlock.gif    
//用方针中的具体翻译类型result.Type替换原来要创建的对象类型t,将修改后的创建责任推给下一个节点
InBlock.gif

InBlock.gif     
return base.BuildUp(context, result.Type, existing, result.ID);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

       

 

应用举例:

      

None.gif class  Program
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
//创建builder 实例
InBlock.gif
         Builder builder = new Builder();
InBlock.gif
InBlock.gif        PolicyList policyList 
= new PolicyList();
InBlock.gif
InBlock.gif        
//创建自己的映射方针,目标类型typeof(MyConcreteClass),被翻译类型typeof(MyAbstractClass),标识"myclass"
InBlock.gif

InBlock.gif        policyList.Set
<ITypeMappingPolicy>(new TypeMappingPolicy(typeof(MyConcreteClass), null), typeof(MyAbstractClass), "myclass");
InBlock.gif
InBlock.gif        MyAbstractClass myclass 
= builder.BuildUp<MyAbstractClass>(null"myclass"null, policyList);
InBlock.gif
InBlock.gif        Console.WriteLine(myclass.GetType().ToString());
InBlock.gif
InBlock.gif 
InBlock.gif        Console.ReadLine();
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif 
None.gif
None.gif
// 抽象基类
None.gif
public   abstract   class  MyAbstractClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
//抽象类具体定义
ExpandedBlockEnd.gif
}

None.gif
None.gif
// 具体实现类
None.gif
public   class  MyConcreteClass : MyAbstractClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
//具体类个性化的定义
InBlock.gif
   private string test;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif

我们可以看到结果会输出:

None.gif   MyConcreteClass


  可见我们通过指定方针就可以轻松的将抽象类或者接口类映射成为具体的实例类,而且这种转换是安全的
None.gif // 检测是否能正常转换这两个类型
None.gif
Guard.TypeIsAssignableFromType(t, result.Type, t);
None.gif


转载于:https://www.cnblogs.com/walkingboy/archive/2006/04/28/387619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值