IoC(Inversion of Control)翻译为控制反转,在之前我们实例化一个对象是要依赖这个对象的类的,而IoC的作用是让对象依赖类变成利用IoC容器统一管理这些对象。从而是类和对象之间耦合度降低。
实例化一个对象,有三种方式:面向接口实例化,利用抽象工厂+反射,还有今天说的利用IoC。
先看下面的代码:一个接口,还有它的实现
namespace Demo { public interface IUserInfo { void Show(); } namespace Demo { public class UserInfo : IUserInfo { public void Show() { Console.WriteLine("hello"); } } }
namespace Demo { class Program { private static void Main(string[] args) { IUserInfo userInfo=new UserInfo(); userInfo.Show(); } } }
namespace Demo { /// <summary> /// 抽象工厂+反射 /// </summary> public static class DALFactory { public static IUserInfo GetusUserInfo() { string classFullName = "Demo.UserInfo"; var obj = Assembly.Load("Demo").CreateInstance(classFullName, true);</span> return obj as IUserInfo; } } }
//控制台代码 namespace Demo { class Program { private static void Main(string[] args) { IUserInfo userInfo = DALFactory.GetusUserInfo(); userInfo.Show(); } } }
先是写配置文件。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--配置容器块--> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <!--容器配置--> <spring> <!--spring容器上下文,统一入口,创建的对象在config://spring/objects这个位置--> <context> <resource uri="config://spring/objects"/> </context> <!--容器中所有的对象--> <objects xmlns="http://www.springframework.net"> <object name="UserInfo" type="Demo.UserInfoEFDal, Demo"> </object> </objects> </spring> </configuration>
namespace Demo { class Program { static void Main(string[] args) { //创建spring.net统一入口 IApplicationContext ctx = ContextRegistry.GetContext(); //控制反转,实例创建由容器创建 IUserInfo dal = ctx.GetObject("UserInfo") as IUserInfo; dal.Show(); Console.ReadLine(); } } }
从三种方式来对比了实例化一个对象的三种方式,第一种是利用面向接口编程的思想,让实现依赖接口,这样的耦合度还是很大。第二种方式利用抽象工厂加反射,这种方式可以完全不用考虑实现接口的类,直接利用工厂获取一个实例,这种方式达到了松耦合的效果;第三种方式应该也是利用了工厂模式的方式,而整个IoC更像一个封装好的工厂,只要我们写配置文件就可以实例对象,更加简单,也更灵活。
原文:http://blog.csdn.net/suneqing/article/details/44546781