• 第四章 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 对象所在容器的引用,以及 在容器中该对象的名称。

  • 相关阅读:
    jq serialize 系列化 乱码 解决办法
    如何使用 TP中的公共函数 (定义在common/common.php中的函数)
    Sublime Text 使用技巧
    动态创建菜单
    jq中写PHP
    redis 管道
    微信强大的demo
    【Hibernate异常处理-1】java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
    【Hibernate学习笔记-5.2】使用@Temporal修饰日期类型的属性
    【Hibernate学习笔记-5.1】使用@Transient修饰不想持久保存的属性
  • 原文地址:https://www.cnblogs.com/hexu6788/p/2955242.html
Copyright © 2020-2023  润新知