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

  我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 。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 对象所在容器的引用,以及 在容器中该对象的名称。

 

posted on   何旭  阅读(1507)  评论(1编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2013年3月 >
24 25 26 27 28 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

统计

点击右上角即可分享
微信分享提示