容器所管理的对象由对象定义来配置,一个对象定义包含以下信息:
对象类型,即所定义对象的实际类型。
对象行为,用来规定对象在IoC容器中的行为(例如,是否布署为singleton,自动装配的模式,依赖检查的模式,初始化和销毁方法等)。
对象创建后要设置的属性值。例如,一个线程池管理对象的可用线程数,或者用来创建线程池的类型信息,* 对象所需要的其它对象,例如一个对象的协作对象(同样可通过属性或构造器设置)。这些对象也可以叫做依赖项。
上面提到了用属性和构造器参数来设置依赖项。Spring.NET支持两种类型的IoC:类型2和类型3(分别是构造器参数注入和属性注入)。也就是说,当一个对象被IoC容器创建时,既可以使用常规的属性设值方法为属性设值,也可以直接向构造器传递参数来为属性赋值。(按:对.NET来说,“属性注入” 似乎比“设值方法注入”更贴切)
上述概念直接对应对象定义中的一系列xml子节点,这些节点及相关的章节如下表所示:
对象定义内容 内容 详细信息
对象类型 对象的创建
id和name 对象标识符(id和name)
singleton或prototype Singleton和Prototype
对象属性 设置对象的属性和协作对象
构造器参数 设置对象的属性和协作对象
自动装配模式 自动装配协作对象
依赖检查模式 检查依赖项
初始化方法 生命周期接口
销毁(destruction)方法 生命周期接口
对象定义会包含对象的类型信息(也有例外,通过实例工厂方法创建对象和,抽象及子对象定义)。多数情况下,容器会根据对象定义中的type属性值去直接调用相应类型的某个构造器。另外,容器也可以调用工厂方法来创建对象,这时type属性的值就应该是包含工厂方法的类型(按:而不是要创建的类型,但通过该对象定义的名称获取的则是由工厂方法所创建的对象)。工厂方法的产品对象可以是工厂方法所在的类型,也可以是其它类型(按:很多情况下工厂方法位于单独的类型中),这无关紧要。
使用构造器创建对象时,并不要求对象必须是某种特定的类型,也不需要了解它的实现方式(按:也就是说,类型不必去实现某个接口或扩展某个基类以求和 Spring.NET兼容,任何对象都可以布署在容器中)。只要指明对象类型(以及它所在的程序集名称)就可以了。不过,根据不同IoC容器的要求,可能需要为类型(显式的)定义默认构造器(即无参的构造器)。(按:由于.NET只会为没有构造器的类型自动添加默认构造器,所以Spring.NET允许类型不定义任何构造器;但如果在定义了含参构造器后仍需使用无参构造器,则必须进行显式定义。)
XmlObjectFactory类实现了IObjectFactory接口,它可以处理XML文件中的对象定义,例如:
<object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary"/>
这个节点定义了一个名为exampleObject的对象,它的类型是位于ExamplesLibrary程序集中的 Examples.ExampleObject类。请特别留心一下type属性的格式:类型的全名,然后是一个逗号,最后是类型所在的程序集名称。在上面的例子中,ExampleObject类定义在Examples命名空间,且位于ExamplesLibrary程序集中。
type属性值必须包含类型所在的程序集名称。另外,如果需要确保Spring.NET能按照预期的类型创建对象,则推荐使用程序集的强命名。不过,一般只有在用到GAC中的程序集时,才需要使用强命名。(按,例如,type="System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089")
如果需要为嵌套类型创建对象,可以使用+号。例如,如果在类型Examples.ExampleObject嵌套定义了类型Person,就可以用下面的方式创建对象定义:
<object id="exampleObject" type="Examples.ExampleObject+Person, ExamplesLibrary"/>
如果应用程序能够以标准的程序集探测机制访问程序集(例如ASP.NET中的bin文件夹),那么type属性的值只需包括类型全名即可。这样,当程序集改变后,不需要去修改每个对象定义的type属性(主要是改些版本号等等),Spring.NET就会自动使用最新的程序集。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ojekleen/archive/2008/01/16/2046265.aspx