[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(一)
ObjectBuilder之創(chuàng)建策略祥解(一) ???????
????????????????????????????????????????????????????????????????????? -Written by 浪子 [walkingboy.cnblogs.com]????
前言:
?
ObjectBuilder已經(jīng)默認(rèn)制定了很多創(chuàng)建策略,可能看到這么多策略加上整個地方架構(gòu)滿天飛,反而搞不清楚如何去應(yīng)用ObjectBuilder創(chuàng)建我們需要的對象了。研究它的原理只是為了更好的發(fā)揮它的功效,本系列將詳細(xì)解析ObjectBuilder中的所有默認(rèn)創(chuàng)建策略的原理以及應(yīng)用:
?
?
1、類型映射策略(TypeMappingStrategy):
?? 上文 講過,策略的具體行為都是由他們各自所對應(yīng)的方針來決定的。類型映射策略也有其映射方針:
??
?? 方針規(guī)范(ITypeMappingPolicy):
{
????/**////?<summary>
????///?Maps?one?Type/ID?pair?to?another.
????///?</summary>
????///?<param?name="incomingTypeIDPair">The?incoming?Type/ID?pair.</param>
????///?<returns>The?new?Type/ID?pair.返回映射后的對象類型&標(biāo)識</returns>
????DependencyResolutionLocatorKey?Map(DependencyResolutionLocatorKey?incomingTypeIDPair);
}
?
?
?
?? 具體方針(TypeMappingPolicy):
?
?????
?????
{
????private?DependencyResolutionLocatorKey?pair;
?????
????/**////?<summary>
????///?Initializes?a?new?instance?of?the?<see?cref="TypeMappingPolicy"/>?class?using
????///?the?provided?type?and?ID.
????///?</summary>
????///?<param?name="type">要翻譯的對象類型</param>
????///?<param?name="id">The?new?ID?to?be?returned?during?Map.</param>
????public?TypeMappingPolicy(Type?type,?string?id)
????{
????????pair?=?new?DependencyResolutionLocatorKey(type,?id);
????}
????/**////?<summary>
????///?See?<see?cref="ITypeMappingPolicy.Map"/>?for?more?information.
????///?</summary>
????public?DependencyResolutionLocatorKey?Map(DependencyResolutionLocatorKey?incomingTypeIDPair)
????{
????????return?pair;
????}
}
?
創(chuàng)建策略中的類型映射應(yīng)用:
?
???????
public?override?object?BuildUp(IBuilderContext?context,?Type?t,?object?existing,?string?id){
????//要創(chuàng)建的對象類型DependencyResolutionLocatorKey
????DependencyResolutionLocatorKey?result?=?new?DependencyResolutionLocatorKey(t,?id);
????//按照創(chuàng)建的對象類型和標(biāo)識查詢上下文中的映射方針
????ITypeMappingPolicy?policy?=?context.Policies.Get<ITypeMappingPolicy>(t,?id);
????if?(policy?!=?null)
????{
????????//將方針中的翻譯對象映射給result
????????result?=?policy.Map(result);
????????//記錄BuildUp日志
?????????TraceBuildUp(context,?t,?id,?Properties.Resources.TypeMapped,?result.Type,?result.ID????"(null)");
????????//檢測是否能正常轉(zhuǎn)換這兩個類型
?????????Guard.TypeIsAssignableFromType(t,?result.Type,?t);
????}
?????????????????????
????//用方針中的具體翻譯類型result.Type替換原來要創(chuàng)建的對象類型t,將修改后的創(chuàng)建責(zé)任推給下一個節(jié)點
?????return?base.BuildUp(context,?result.Type,?existing,?result.ID);
}
???????
?
應(yīng)用舉例:
??????
{
????static?void?Main(string[]?args)
????{
????????//創(chuàng)建builder?實例
?????????Builder?builder?=?new?Builder();
????????PolicyList?policyList?=?new?PolicyList();
????????//創(chuàng)建自己的映射方針,目標(biāo)類型typeof(MyConcreteClass),被翻譯類型typeof(MyAbstractClass),標(biāo)識"myclass"
????????policyList.Set<ITypeMappingPolicy>(new?TypeMappingPolicy(typeof(MyConcreteClass),?null),?typeof(MyAbstractClass),?"myclass");
????????MyAbstractClass?myclass?=?builder.BuildUp<MyAbstractClass>(null,?"myclass",?null,?policyList);
????????Console.WriteLine(myclass.GetType().ToString());
?
????????Console.ReadLine();
????}
}
?
//抽象基類
public?abstract?class?MyAbstractClass
{
???//抽象類具體定義
}
//具體實現(xiàn)類
public?class?MyConcreteClass?:?MyAbstractClass
{
???//具體類個性化的定義
???private?string?test;
}
我們可以看到結(jié)果會輸出:
??MyConcreteClass
? 可見我們通過指定方針就可以輕松的將抽象類或者接口類映射成為具體的實例類,而且這種轉(zhuǎn)換是安全的
//檢測是否能正常轉(zhuǎn)換這兩個類型
Guard.TypeIsAssignableFromType(t,?result.Type,?t);
總結(jié)
以上是生活随笔為你收集整理的[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Community Server系列之二
- 下一篇: 被上海爱立信录取,GL