上一篇文章中的HELLOWORLD示例展示了Spring.NET中IOC的使用方法之一,这里我们简单来描述一下IOC及其作用和IOC容器管理的对象定义、创建。
IOC的全称是Inversion of Control,翻译成中文是控制反转,这个名称会给初学者带来误导,本来很快入门的可能要花更长时间。正因为如此,2004年初有了新的叫法,依赖注入,也就是在需要的时候获得对象实例及其他附加信息.
IOC的一些思想其实大家很早就有,所以掌握Spring.NET IOC并非难事.大家都解过二元方程组吧,有一种解法就是使用代入消元法,比如有一个x和y组成的二元方程,要想解出这个方程组来,先要通过其中一个方程得到x关于y的表达式,然后将这个表达式代入另一个方程中,就得到一个一元方程,这样很容易就得到了结果。在这个过程中,由第一个方程中得到x并代入第二个方程解决问题的方法,正好和Spring.NET IOC容器的注入机制有了几分相似,但Spring.NET IOC是根据xml配置文件中定义的类名来得到对象,实质就是用改进的工厂模式来管理XML中定义的对象,然后用反射机制来生成对象注入的,而且在.Net中修改XML文件来管理注入,实现了真正的即插即用.如果把握住这个实质,掌握Spring.NET IOC就是一件很容易的事情.
到目前我所认识到的Spring.NET IOC带来的好处就是使组件的共享变的很容易.看看Spring.NET IOC容器支持的两种注入方式:
• 构造方法注入
• 设置属性注入
Spring.NET提供的两个主要的IOC容器:
IObjectFactory
IApplicationContext
使用XmlObjectFactory(XmlObjectFactory是IobjectFactory的一个实现)创建容器的例子:
IResource input = new FileSystemResource ("objects.xml");
IObjectFactory factory = new XmlObjectFactory(input);
使用IApplicationContext(IApplicationContext仍然是IObjectFactory的一个实现)创建容器的例子:
IApplicationContext context = new XmlApplicationContext("file://myobjects.xml",
"assembly://MyAssembly/MyProject/myobjects-dal-layer.xml");
IObjectFactory factory = (IObjectFactory) context;
下面来了解Spring.NET IOC容器的对象的构成及定义:
一个对象定义包含以下信息:
1.对象类型,即所定义对象的实际类型
2.对象行为,用来规定对象在IoC容器中的行为(例如,是否布署为singleton,自动装配的模式,依赖检查的模式,初始化和销毁方法等)
3.对象创建后要设置的属性值。例如,一个线程池管理对象的可用线程数,或者用来创建线程池的类型信息,都可以通过属性或构造器参数进行设置
4.对象所需要的其它对象,例如一个对象的协作对象(同样可通过属性或构造器设置)。这些对象也可以叫做依赖项
对象定义和其具体内容对应如下:
对象类型 对象的创建
id和name 对象标识符(id和name)
singleton或prototype Singleton和Prototype
对象属性 设置对象的属性和协作对象
构造器参数 设置对象的属性和协作对象
自动装配模式 自动装配协作对象
依赖检查模式 检查依赖项
初始化方法 生命周期接口
销毁(destruction)方法 生命周期接口
对象定义的位置可以在.net的标准应用程序配置或者自定义的XML文件中,定义为如下片段:
<objects xmlns="http://www.springframework.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">
<object id="..." type="...">
...
</object>
<object id="...." type="...">
...
</object>
...
</objects>
对象的创建:
1. 通过构造方法创建:
<object id="myObject" type="Myapp.Myobject, MyappLibrary"/>
其中定义了一个名为myObject的对象,类型是Myapp中的Myobject,位置在MyappLibrary中
如果在类型Myobject中还嵌套定义了类型Car,则定义如下:
<object id="myObject" type="Myapp.Myobject+Car, MyappLibrary"/>
2. 通过静态工厂方法创建对象
<object id="myObject" type="Myapp.MyobjectFactory,MyappLibrary" factory-method=”staticfactoryMethod”/>
其中的staticfactoryMethod要求为静态工厂方法
3. 实例工厂方法创建对象
<object id="myObject" factory-method="CreateInstance"
factory-object="myFactory"/>
这里就不需要type指定类型,而是借助factory-object来进行对象的依赖注入
4. 泛型对象的创建
跟上面相似,要注意的细节是表示泛型的左尖括号<要替换成字符串“<”
在这里简述了Spring.NET IOC机制及其管理的对象的创建和配置,更多关于IOC的内容请继续关注本人BLOG。