上次我们从总体上了解了一下Microsoft.Practices.ObjectBuilder这个类库,今天我们来看看它是怎样来完成对象的创建以及我们怎么应用它来为我们创建我们所需要的对象的,从源码中我们可以看到可以创建Singleton对象等等,每个对象的创建都对应着每一个策略以及相应的方针,下面我们通过例子来为各个对象的创建进行逐个说明。
首先就是先看看上次的一个例子,创建一个Singleton对象,代码如下:
上面的例子就是通过ObjectBuilder来创建Singleton模式的对象,大部分利用ObjectBuilder来创建对象的过程都和上面的过程差不多。为了创建一个对象,我们要创建一个上下文,而一个上下文又要求一个定位器,以及策略链,和一个方针略表。从代码我们可以知道要创建一个Singleton对象,我们需要一个SingletonStrategy策略,而SingletonStrategy又要有一个 SingletonPolicy方针。
在OB中包含了很多设计模式,例如上面的策略模式,责任链模式等等都需要我们对其有所了解。上面还用到了一个定位器Locator,它能知道怎样去寻找已经注册过的对象。在创建Singleton对象的还需要我们知道的是,定位器知从当前搜索,即为local而没有从其父定位器进行搜索。代码如下:
从上面的代码我们可以看到,在SingletonStrategy策略中先判断上下文中是否包含一个定位器,如果包含则通过SearchMode.Local进行检索,也就是告诉定位器不要再父定位器重搜索。
我们还可以看出在创建对象时,我们还用到了CreationStrategy和CreationPolicy,从CreationStrategy类中,我们可以发现BuildUp方法检测了是否需要创建一个新对象或是已经存在一个新对象。在我们的例子里是第一次创建对象所以将调用 BuildUpNewObject方法。这个方法是通过ICreationPolicy来获取一个对象从而来创建上下文,如果不存在或找不到则将抛出错误,也就是说我们需要注册一个对象个CreationPolicy方针,从而告诉OB怎样去创建一个对象。在我们的例子中我们用到了 DefaultCreationPolicy方针,如果存在一个ICreationPolicy,那么那个方法将创建一个为初始化的类型 existing = FormatterServices.GetSafeUninitializedObject(typeToBuild); 然后在调用 RegisterObject()来注册对象。
首先就是先看看上次的一个例子,创建一个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 }
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 }
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://www.cnblogs.com/xdotnet/archive/2007/02/01/enterpriselibrary_objectbuilder_singleton.html,如需转载请自行联系原作者