IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。
其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。
简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IOC模式,系统中通过引入实现了IOC模式的IOC容器,即可由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配件文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
一个例子:
1.新建控制台应用程序,添加Srping.Core程序集引用
2.配置app.config,代码如下
<?xmlversion="1.0"encoding="utf-8" ?> <configuration> <configSections> <!--增加spring.net支持--> <sectionGroupname="spring"> <sectionname="context"type="Spring.Context.Support.ContextHandler, Spring.Core"/> <sectionname="objects"type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <!--配置spring节点--> <spring> <contexttype="Spring.Context.Support.XmlApplicationContext, Spring.Core"> <!--此节点说明配置文件在哪里--> <resourceuri="config://spring/objects"/> </context> <!--配置类的实例,一般放到单独文件中--> <objectsxmlns="http://www.springframework.net"> <!--声明一个类对象--> <objectid="hello1"type="HelloWorld.Hello,HelloWorld"> <!--初始化类对象的属性,此处可以用ref做引用已经声明的对象,也可用value直接赋值--> <propertyname="SayHello"value="Hello World"></property> </object> </objects> </spring> </configuration> <!-- 1.<context>节点的type属性是可选的,在Windows应用中,其默认值就是Spring.Context.Support.XmlApplicationContext 2.spring和context节点的名称不是任意的,必须是"spring"和"context",Spring.NET本身将"spring/context"作为字符串常量定义在了AbstractApplicationContext类中以表示上下文的节点名称。 -->
3.编写代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Spring.Context; using Spring.Context.Support; namespace HelloWorld { public class Program { staticvoid Main(string[] args) { IApplicationContext context = ContextRegistry.GetContext();//声明一个spring容器,该容器通过配置文件加载对象 Hello hello = context.GetObject("hello") asHello;//从容器中获取对象 Console.WriteLine(hello.SayHello); } } public class Hello { public string SayHello { get; set; } } }
这个程序很简单,没有做太多的事情。但它的确讲清楚了如何用XML配置来装配对象这一基本功能。这些简单的功能可以应付80%的需求。诸如工厂方法、惰性初始化以及其它较少用到的特性,Spring.NET也都支持的非常好