[浪子学编程][MS Enterprise Library]ObjectBuilder内功心法之中国特色

ObjectBuilder内功心法之中国特色

                                                                                                     -Written by 浪子

    

 

 

摘要:

    ObjectBuilder 模块的代码断断续续已经读了半个月左右了,今天突然间豁然开朗,顿悟出其中的奥妙。正所谓:“迷人若悟心开,与大智人无别。故知不悟,即佛是众生;一念若悟,即众生是佛。”。


 

    经过日复一日的刻苦修行,我佛慈悲,终于顿悟心开,成为大智人了。用慧眼旁观EnterLib之ObjectBuilder,发现其中蕴涵如此厚重的中国底蕴气息,以致于我要怀疑微软公司模式与实践小组的成员是不是中国某些政府部门偷渡跳槽过去的:)


þ     
第二代身份证(责任链模式&策略模式)

    当我还怀揣着两张不旧不新的身份证的时候,却被通知需要重新办理第二代居民身份证,我真是那个晕啊。不过相对那些刚办完旧的身份证,第二个月就被通知再次办理新的第二代身份证的同志嘛,呵呵……

 

    不过通知归通知,由于迫于生计没日没月的加班加点,办证的那帮“大爷”又是从来不要加班的,所以下班后去要求他加班帮我办理身份证,显然是不可能di;虽然办新证是他们要求我的,但是我却只能把他们尊为“大爷”……(My God,这是什么世道啊!)

 

    好不容易手头上的项目暂告一段落,忙里偷闲中决定去把这件烦心事给了了,以免夜长梦多,那些个“大爷”耍大牌出怪招,那俺这些小民可承受不起。


 

None.gif【浪子注:】: 此时我们有了目标了就是办理身份证
None.gif
None.gif // 办证方法
None.gif
public  interface IBuilder<TStageEnum>
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
ExpandedSubBlockStart.gif ContractedSubBlock.gif   PolicyList Policies   dot.gifget; }
ExpandedSubBlockStart.gif ContractedSubBlock.gif   StrategyList<TStageEnum> Strategies   dot.gifget; }   
InBlock.gif
InBlock.gif    // 我要办证 
InBlock.gif
    object BuildUp(IReadWriteLocator locator, Type typeToBuild,  string idToBuild,  object existing,  params PolicyList[] transientPolicies);
InBlock.gif
InBlock.gif    // 泛型方法,办理TTypeToBuild 类型的证件,当然此时我们要的是第二代身份证
InBlock.gif
   TTypeToBuild BuildUp<TTypeToBuild>(IReadWriteLocator locator,  string idToBuild,  object existing,  params PolicyList[] transientPolicies);
InBlock.gif
InBlock.gif
InBlock.gif   TItem TearDown<TItem>(IReadWriteLocator locator, TItem item);
ExpandedBlockEnd.gif    }
None.gif

 

    本来以为直接去办证就可以了,结果发现没那么简单,要这样这样,那样那样……,看来还没有那么容易啊,还需要好多个手续。(当然只有具有办理身份证只能的部门我才需要去那里办理手续)


None.gif【浪子注:】: 
None.gif
None.gif // 办证职能
None.gif
public  interface IBuilderStrategy
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif     // 我要办证
InBlock.gif
     object BuildUp(IBuilderContext context, Type typeToBuild,  object existing,  string idToBuild);
ExpandedBlockEnd.gif}
None.gif
None.gif 
None.gif
None.gif // 政府规定拥有办证职能的部门(策略的抽象基类)
None.gif

None.gif public  abstract  class BuilderStrategy : IBuilderStrategy
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif     public  virtual  object BuildUp(IBuilderContext context, Type typeToBuild,  object existing,  string idToBuild)
ExpandedSubBlockStart.gif ContractedSubBlock.gif     dot.gif{
InBlock.gif        // 但是也不能饿了下面的兄弟门啊,兄弟你们先吃吧
InBlock.gif
       IBuilderStrategy next = context.GetNextInChain( this);
InBlock.gif
InBlock.gif
InBlock.gif        // 吃饱了吗,没饱,那放开怀继续
InBlock.gif
        if (next !=  null)
InBlock.gif           return next.BuildUp(context, typeToBuild, existing, idToBuild);
InBlock.gif        else // 你们饱啦,那该我了
InBlock.gif
            return existing;
InBlock.gif
ExpandedSubBlockEnd.gif       }
ExpandedBlockEnd.gif}
None.gif


 

None.gif // 下面的兄弟还真不少啊,地方上拥有办证职能的部门
None.gif 
None.gif
// 实现了策略的抽象基类
None.gif
public  class TypeMappingStrategy : BuilderStrategy
None.gif
None.gif public  class SingletonStrategy : BuilderStrategy
None.gif
None.gif public  abstract  class ReflectionStrategy<TMemberInfo> : BuilderStrategy
None.gif
None.gif……
None.gif
None.gif 
None.gif
None.gif // 当然这些部门里面还可能分好多小部门,比如ReflectionStrategy<TMemberInfo>部门,这丫的比较有权力,好多内部部门都拥有办证职能
None.gif

None.gif public  class ConstructorReflectionStrategy : ReflectionStrategy<ConstructorInfo>
None.gif
None.gif public  class PropertyReflectionStrategy : ReflectionStrategy<PropertyInfo>
None.gif
None.gif public  class MethodReflectionStrategy : ReflectionStrategy<MethodInfo>
None.gif




 


    这些部门还不少啊,出发前,我特意找过来人列了张清单:

        1、 厦门人才中心:凭借身份证,毕业证领取户口页;

        2、 去公安局指定的照相馆照相;凭借户口页照相交钱,然后领取身份证领取凭证

        3、 去户口所在地的公安局领取新身份证:凭借从照相馆拿到的凭证去领新的身份证

    由此可看出,其实只有到了最后公安局那里我们才能真正达到我们的目的:办理新的身份证,中间的那些个部门根本就没有权利办理新证件,只不过做了些他们自己的事情(例如收钱......)


None.gif【浪子注:】: 
None.gif
None.gif // 各个部门都要做些自己的事情,但是也不能乱来,组织上还是有些规定了
None.gif
// 空接口
None.gif
public  interface IBuilderPolicy
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif     // 当然是老样子了,口头上说说而已,挂羊头卖狗肉也
ExpandedBlockEnd.gif
}
None.gif
None.gif // 肉到嘴边总不能不吃吧,办证前我也得捞点油水。不过捞归捞还是应该响应组织的号召的
None.gif
public  interface ITypeMappingPolicy : IBuilderPolicy 
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    // 地方的政策方针
InBlock.gif
   DependencyResolutionLocatorKey Map(DependencyResolutionLocatorKey incomingTypeIDPair);
ExpandedBlockEnd.gif}
None.gif
None.gif 
None.gif
None.gif // 咱们头ITypeMappingPolicy已经向组织IBuilderPolicy汇报过了,你们放心捞吧
None.gif
// 各个部门的具体实施方针
None.gif
public  class TypeMappingPolicy : ITypeMappingPolicy
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    private DependencyResolutionLocatorKey pair;
InBlock.gif
InBlock.gif    public TypeMappingPolicy(Type type,  string id)
ExpandedSubBlockStart.gif ContractedSubBlock.gif    dot.gif{
InBlock.gif      pair =  new DependencyResolutionLocatorKey(type, id);
ExpandedSubBlockEnd.gif   }
InBlock.gif
InBlock.gif    public DependencyResolutionLocatorKey Map(DependencyResolutionLocatorKey incomingTypeIDPair)
ExpandedSubBlockStart.gif ContractedSubBlock.gif    dot.gif{
InBlock.gif       return pair;
ExpandedSubBlockEnd.gif   }
InBlock.gif
ExpandedBlockEnd.gif}
None.gif

 

 

    真是犹如乱麻啊,不过我也管不了,我只能按照规定的方法(IBuilder<TStageEnum>)去办理我自己的身份证,为了这个我还准备了一份计划书:

 

 

None.gif【浪子注:】: 谁叫俺搞IT的,客户每次都要我的计划书,养成习惯了
None.gif
None.gif // 浪子的办证计划书
None.gif
public  class BuilderBase<TStageEnum> : IBuilder<TStageEnum>
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif    // 把了解到政策记下来(各个策略的具体实施方针)
InBlock.gif
    private PolicyList policies =  new PolicyList();
InBlock.gif
InBlock.gif    // 把需要经过的部门也给记下来(具体的策略类)
InBlock.gif
    private StrategyList<TStageEnum> strategies =  new StrategyList<TStageEnum>();
InBlock.gif
InBlock.gif    // 啥都准备了,办证可不能忘哦 :)(调用)
InBlock.gif
     private  object DoBuildUp(IReadWriteLocator locator, Type typeToBuild,  string idToBuild,  object existing,PolicyList[] transientPolicies)
InBlock.gif
InBlock.gif // 调用之前先武装自己(初始化责任连模式的上下文关系)
InBlock.gif
// 用了解到的政策方针,所有经过的部门都武装到脑袋里,制定执行方案
InBlock.gif

InBlock.gif private IBuilderContext MakeContext(IBuilderStrategyChain chain,IReadWriteLocator locator,  params PolicyList[] transientPolicies)
ExpandedSubBlockStart.gif ContractedSubBlock.gif dot.gif{
InBlock.gif   PolicyList policies =  new PolicyList( this.policies);
InBlock.gif    foreach (PolicyList policyList  in transientPolicies)
InBlock.gif      policies.AddPolicies(policyList);
InBlock.gif   
InBlock.gif    // 返回初始化后的上下文关系
InBlock.gif
    return  new BuilderContext(chain, locator, policies);
InBlock.gif
ExpandedSubBlockEnd.gif   }
InBlock.gif
ExpandedBlockEnd.gif}
None.gif

 


 

    全部武装之后,按照计划书实施办证事宜:


None.gif【浪子注:】: 
None.gif
None.gif // 向领导汇报请假,走出公司大楼,面对艰辛的旅途,狼吼一声:老子,来办证了!
None.gif
public TTypeToBuild BuildUp<TTypeToBuild>
None.gif
None.gif 
None.gif
None.gif // 不过理智告诉我,不能冲动,应该按照执行方案去做
None.gif
None.gif
// 首先要去人才中心(获取责任连的第一个节点)
None.gif
chain.Head.BuildUp(context, typeToBuild, existing, idToBuild);




    大热天,好不容易从拥挤的bus上挤下来,带着一身的汗水登上人才中心服务大厅。哇靠,门没开。心想完了,这帮***没上班,瞄了眼门上的工作时间表,下午2:30~5:30,晕死不是吧,俺们1:30就开工了,没人性啊。好不容易熬过半个多钟头,大门才缓缓开启,我立马冲上去对着那位老大妈 ,小声的说:我要办身份证 (没辙,人在屋檐下不得不低头)


None.gif【浪子注:】: 
None.gif
None.gif // 我要办身份证            
None.gif

None.gif public  override  object BuildUp(IBuilderContext context, Type t,  object existing,  string id)
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
InBlock.gif   DependencyResolutionLocatorKey esult =  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.gif ContractedSubBlock.gif    dot.gif{
InBlock.gif       //果不其然,不宰我才怪呢(执行此策略的具体方针)
InBlock.gif      result = policy.Map(result);
InBlock.gif      TraceBuildUp(context, t, id, Properties.Resources.TypeMapped, result.Type, result.ID ?? "(null)");
InBlock.gif      Guard.TypeIsAssignableFromType(t, result.Type, t);
ExpandedSubBlockEnd.gif   }
InBlock.gif   
InBlock.gif    // 大妈吃完后,擦擦嘴对我说:我饱了,你去问问上头,看还有谁没吃饱的(此具体策略执行完后,将责任推给责任链上的下一个节点)
InBlock.gif
    return  base.BuildUp(context, result.Type, existing, result.ID);
ExpandedBlockEnd.gif}
None.gif
None.gif 
None.gif



 

    我的天,经过一系列的吃人事件,终于把办理身份证所需的手续都办理结束,临了我拖着付空骨架回了公司,立马登上公司头版头条新闻:“奇迹:荆艺某同志亲历系列吃人恐怖事件居然生还……”

 

þ      我辈芸芸众生(上下文关系)

 

    其实之所谓发生如此惨绝人寰的系列吃人事件,罪魁祸首是吃人者无处不在,但是与被吃者自身主动献身也有极大关系。是被吃者为吃人者提供了有用的信息,甚至是自己甘愿送上门去被吃。

 

None.gif【浪子注:】: 
None.gif
None.gif // 被吃者最佳攻略手册(上下文关系接口规范)
None.gif

None.gif public  interface IBuilderContext
ExpandedBlockStart.gif ContractedBlock.gif dot.gif{
  InBlock.gif    // 第一个吃的人(责任链的第一个节点)
ExpandedSubBlockStart.gif ContractedSubBlock.gif   IBuilderStrategy HeadOfChain   dot.gifget; }
InBlock.gif
InBlock.gif     // 是不是被吃过了(定位器,用来寻找此对象是否被创建过)
ExpandedSubBlockStart.gifContractedSubBlock.gif
   IReadWriteLocator Locator   dot.gifget; }
InBlock.gif
InBlock.gif     // 他们想怎么吃,投其所好(具体策略的执行方针)
ExpandedSubBlockStart.gifContractedSubBlock.gif
   PolicyList Policies   dot.gifget; }
InBlock.gif
InBlock.gif    // 下一个该轮到谁吃(责任链上的下一个具体策略是who?)
InBlock.gif
   GetNextInChain(IBuilderStrategy currentStrategy);
InBlock.gif
ExpandedBlockEnd.gif   }     
None.gif
None.gif 
None.gif
None.gif // 在我们开始要办证的时候就注定了这系列惨剧必定发生
None.gif
None.gif
// 为出卖自己做好准备(初始化上下文关系)
None.gif

None.gifIBuilderContext context = MakeContext(chain, locator, transientPolicies);
None.gif

 

 

 

þ      资源再利用(定位器)

    在去人才中心被宰的时候,顺便借出了户口页,然后赶快复印一份存起来,再去办理失业证的时候,我就可以在我的备份库里面找到身份证复印件,而避免再次被****


    定位器的细节参考园子里其他朋友的文章:

        1niwalker的专栏ObjectBuilder技术内幕(一)

        2Terrylee.NET设计模式(11):组合模式(Composite Pattern)

 

 

分类: 1.首页原创精华.NET区123,IoC / DI,浪子学编程



本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/04/19/LangZi_ObjectBuilder_NeiGongXinFa.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值