.NET人字拖
万丈高楼平地起,我正在努力筑地基...
随笔- 133  文章- 0  评论- 606 
博客园  社区  首页  新随笔  联系  管理  订阅 订阅

[EnterpriseLibrary]Microsoft.Practices.ObjectBuilder来创建Singleton对象

  上次我们从总体上了解了一下Microsoft.Practices.ObjectBuilder这个类库,今天我们来看看它是怎样来完成对象的创建以及我们怎么应用它来为我们创建我们所需要的对象的,从源码中我们可以看到可以创建Singleton对象等等,每个对象的创建都对应着每一个策略以及相应的方针,下面我们通过例子来为各个对象的创建进行逐个说明。

  首先就是先看看上次的一个例子,创建一个Singleton对象,代码如下:
 
 1     public class OBSample
 2     {
 3         public bool CreateSingletonSample() {
 4             // 我们需要一个定位器,一个策略链和一个方针列表
 5             Locator locator = new Locator();
 6             BuilderStrategyChain strategyChain = new BuilderStrategyChain();
 7             PolicyList policies = new PolicyList();
 8             //我们要创建一个Singleton对象,需要一个Singleton策略,同时Sigleton策略有Singleton方针来完成。
 9             strategyChain.Add(new SingletonStrategy());
10             strategyChain.Add(new CreationStrategy());
11             policies.Set<ISingletonPolicy>(new SingletonPolicy(true), typeof(TestObject), null);
12             policies.SetDefault<ICreationPolicy>(new DefaultCreationPolicy());
13             // 我们需要一个LifetimeContainer用来放置这个对象。
14             locator.Add(typeof(ILifetimeContainer), new LifetimeContainer());
15             // 创建上下文。
16             BuilderContext context = new BuilderContext(strategyChain, locator, policies);
17             object obj1 = strategyChain.Head.BuildUp(context, typeof(TestObject), "TestObject_Singleton", null);
18             object obj2 = strategyChain.Head.BuildUp(context, typeof(TestObject), "TestObject_Singleton", null);
19             if (obj1 == obj2) {
20                 return true;
21             }
22         }
23     }
24 
25     public class TestObject
26     {
27         public TestObject() {
28         }
29     }

  上面的例子就是通过ObjectBuilder来创建Singleton模式的对象,大部分利用ObjectBuilder来创建对象的过程都和上面的过程差不多。为了创建一个对象,我们要创建一个上下文,而一个上下文又要求一个定位器,以及策略链,和一个方针略表。从代码我们可以知道要创建一个Singleton对象,我们需要一个SingletonStrategy策略,而SingletonStrategy又要有一个
SingletonPolicy方针。

  在OB中包含了很多设计模式,例如上面的策略模式,责任链模式等等都需要我们对其有所了解。上面还用到了一个定位器Locator,它能知道怎样去寻找已经注册过的对象。在创建Singleton对象的还需要我们知道的是,定位器知从当前搜索,即为local而没有从其父定位器进行搜索。代码如下:

 1 public class SingletonStrategy : BuilderStrategy
 2  {
 3     public override object BuildUp(IBuilderContext context, Type typeToBuild, object existing, string idToBuild)
 4     {
 5 
 6        DependencyResolutionLocatorKey key = new DependencyResolutionLocatorKey(typeToBuild, idToBuild);
 7 
 8  
 9 
10        if (context.Locator != null && context.Locator.Contains(key, SearchMode.Local))
11        {
12             TraceBuildUp(context, typeToBuild, idToBuild, "");
13              return context.Locator.Get(key);
14        }
15 
16  
17 
18        return base.BuildUp(context, typeToBuild, existing, idToBuild);
19     }
20  }

  从上面的代码我们可以看到,在SingletonStrategy策略中先判断上下文中是否包含一个定位器,如果包含则通过SearchMode.Local进行检索,也就是告诉定位器不要再父定位器重搜索。

  我们还可以看出在创建对象时,我们还用到了CreationStrategy和CreationPolicy,从CreationStrategy类中,我们可以发现BuildUp方法检测了是否需要创建一个新对象或是已经存在一个新对象。在我们的例子里是第一次创建对象所以将调用
BuildUpNewObject方法。这个方法是通过ICreationPolicy来获取一个对象从而来创建上下文,如果不存在或找不到则将抛出错误,也就是说我们需要注册一个对象个CreationPolicy方针,从而告诉OB怎样去创建一个对象。在我们的例子中我们用到了DefaultCreationPolicy方针,如果存在一个ICreationPolicy,那么那个方法将创建一个为初始化的类型existing = FormatterServices.GetSafeUninitializedObject(typeToBuild);然后在调用RegisterObject()来注册对象。

  就如你所见到的一样,CreationStrategy在当前的Locator中查找一个Lifetime Container,如果存在将查找一个已被将要创建的对象注册的SingletonPolicy。说来说去我们还是在所我们要创建一个Singleton对象,我们需要一个SingletonStrategy和一个SingletonPolicy。也就是说我们要创建一个对象时,我们要注册他,当我们要创建一个对象时,我们要先检查对象是否已经被创建。

  如果有不对的地方请指出,谢谢!

关于作者:网魂小兵

文章出处:http://xdotnet.cnblogs.com

本文可以随意转载,摘抄等非商业用途。

为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处。

绿色通道:好文要顶关注我收藏该文与我联系
posted @ 2007-02-01 14:24 网魂小兵 阅读(2368) 评论(4) 编辑 收藏
638309
#1楼无常       在2007-02-01 15:03说:
这么麻烦
 回复 引用 查看   
#2楼[楼主]网魂小兵       在2007-02-02 14:33说:
@无常

OB适合创建交错复杂的对象,相对于这个测试中的对象当然是显得麻烦,

呵呵,不过看看EL中的扩展也不是很麻烦!

 回复 引用 查看   
#3楼路过[未注册用户] 在2007-02-02 15:32说:
老大是否该用个复杂点的例子哦,这个好像有点把简单的问题复杂化了.^_^.像是为了OB而OB,不过谢谢你的文章,正准备学习这方面的东东
 回复 引用   
#4楼[楼主]网魂小兵       在2007-02-02 17:14说:
@路过

这个是为了说明才举的这个例子,如果那复杂的例子来写,那还要写一堆专门介绍例子的,太麻烦了,先用着先,呵呵!

谢谢你的建议:)

 回复 引用 查看   
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页。
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 初创企业能从Linux学习些什么
· Facebook单帖回复数超百万创吉尼斯世界纪录
· 春节后礼品回收iPhone成新宠燕窝被冷落
· 分析称苹果近1000亿现金储备最佳用途是派息
· 扎克伯格11件蠢事:曾同意将Facebook卖给雅虎
» 更多新闻...
最新知识库文章:
· 高级编程语言的发展历程
· 如何学习一门新的编程语言?
· 学习不同编程语言的重要性
· 为什么我喜欢富于表达性的编程语言
· 计算机专业的女生为什么要学编程
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
Copyright ©2012 网魂小兵
Name:
网魂小兵
Addr:
福建厦门
MSN:
myxbing#hotmail.com
昵称:网魂小兵
园龄:5年11个月
粉丝:23
关注:0

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签
  • 更多链接

我的标签

  • directx11(6)
  • direct3d 11(6)
  • 游戏编程(6)
  • c/c++(6)
  • vs2010(5)
  • wpf(4)
  • openssl(2)
  • direct3d坐标系(2)
  • vs2008(2)
  • xaml(2)
  • 更多

随笔分类(170)

  • AJAX(doc)(8)
  • ASP.NET(46)
  • C#3.0+(13)
  • C/C++(27)
  • CommunityServer(7)
  • Database(11)
  • Enterprise Library (7)
  • JavaScript(10)
  • ServerContols(7)
  • UML(1)
  • VC++/MFC(8)
  • WPF/SilverLight(6)
  • XNA Game(2)
  • 翻译(4)
  • 今天我当家(11)
  • 设计模式(2)

随笔档案(133)

  • 2012年2月 (3)
  • 2011年8月 (3)
  • 2011年7月 (7)
  • 2011年5月 (1)
  • 2011年4月 (2)
  • 2011年2月 (1)
  • 2010年1月 (1)
  • 2009年3月 (3)
  • 2009年1月 (8)
  • 2008年3月 (1)
  • 2008年2月 (3)
  • 2008年1月 (1)
  • 2007年11月 (4)
  • 2007年10月 (3)
  • 2007年9月 (9)
  • 2007年8月 (3)
  • 2007年7月 (2)
  • 2007年6月 (9)
  • 2007年5月 (9)
  • 2007年4月 (14)
  • 2007年3月 (6)
  • 2007年2月 (3)
  • 2007年1月 (15)
  • 2006年12月 (9)
  • 2006年11月 (2)
  • 2006年10月 (4)
  • 2006年9月 (7)

文章分类

  • Asp.Net(.NET)

I Like Links

  • ASP.NET
  • Codeplex
  • XNADevelopment

My Friend's Blog

  • 陆巍杰
  • 孙小雨
  • 探丫头
  • 网络安全&Linux

积分与排名

  • 积分 - 283924
  • 排名 - 248

最新评论

阅读排行榜

评论排行榜