第四章 Spring.Net 如何管理您的类___让对象了解自己的容器

长平狐 发布于 2013/03/12 13:03
阅读 140
收藏 0

我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 。Spring.Net 中提供了两个接口,我们使用这两个接口可以让对象了解自己的容器。

一 . IObjectFactoryAware 接口

实现了 Spring.Objects.Factory.IObjectFactoryAware 接口 的对象可以在被容器创建后获取它所在容器的引用。该接口只有一个(只写的)属性:

IObjectFactory ObjectFactory:该属性会在初始化方法(IInitializingObject 的 AfterPropertiesSet 方法,或在对象定义中由 init-method 属性 指定的方法)完成后被赋值。

IObjectFactoryAware 接口 允许对象通过编程方式访问创建它的容器,一般主要用来在编程时获得容器内的其它对象。虽然这种方式在某些情况下(似乎)很有用,但我们应该尽量避免这么做,因为这会导致代码同 Spring.NET 发生紧耦合,并且违反了控制反转原则。

 

二 . IObjectNameAware 接口

Spring.Objects.Factory.IObjectNameAware 接口 可让对象知道在容器中叫什么名称,如果对象需要知道自己在容器中的名称,可以实现该接口:

string ObjectName:该属性使实现了 IObjectNameAware 接口 的对象能够知道自己在容器中的名称。

 

我们来看代码:

Person 类,实现了 IPerson 接口,IPerson 接口有一个 SayHi() 方法,在 Person 类中还实现了 IObjectNameAware 和 IObjectFactoryAware 接口:

1 using System; 2 using Spring.Objects.Factory; 3 4 namespace CnblogLesson_4_8.Model 5 { 6 public class Person : IPerson, IObjectNameAware, IObjectFactoryAware 7 { 8 private string _objectName; 9 private IObjectFactory _iObjectFactory; 10 11 public void SayHi() 12 { 13 Console.WriteLine( " 我的容器是{0},我叫{1} " ,_iObjectFactory,_objectName); 14 } 15 16 public string ObjectName 17 { 18 set 19 { 20 _objectName = value; 21 Console.WriteLine( " 调用 IObjectNameAware 的设置 ObjectName 方法 " ); 22 } 23 24 } 25 26 public IObjectFactory ObjectFactory 27 { 28 set 29 { 30 _iObjectFactory = value; 31 Console.WriteLine( " 调用IObjectFactoryAware 的设置 ObjectFactory 方法 " ); 32 } 33 34 } 35 } 36 }

Objects.xml 配置:

1 <? xml version="1.0" encoding="utf-8" ?> 2 < objects xmlns ="http://www.springframework.net" > 3 4 < object id ="hexu" type ="CnblogLesson_4_8.Model.Person,CnblogLesson_4_8" > 5 </ object > 6 7 </ objects >

主程序代码:

1 using System; 2 using Spring.Context; 3 using Spring.Context.Support; 4 using CnblogLesson_4_8.Model; 5 6 namespace CnblogLesson_4_8 7 { 8 class Program 9 { 10 static void Main( string [] args) 11 { 12 Console.WriteLine( " \n\n\n " ); 13 14 // 通过IApplicationContext来配置 15 IApplicationContext context = ContextRegistry.GetContext(); 16 17 IPerson hexu = context.GetObject( " hexu ") as Person; 18 hexu.SayHi(); 19 20 Console.ReadKey(); 21 } 22 } 23 }

看一下结果:

 

通过 IObjectNameAware, IObjectFactoryAware 接口,我们可以获取 hexu 对象所在容器的引用,以及 在容器中该对象的名称。

示例代码 :  http://download.csdn.net/detail/cilence6788/5132327


原文链接:http://www.cnblogs.com/cilence/archive/2013/03/12/2955242.html
加载中
返回顶部
顶部