控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。
Ioc和DI都是一种设计模式,需要了解的它们,首先得去了解这两种设计模式。通俗的理解可以为:IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
实现控制反转的常用的开源架构:StructureMap, ObjectBuilder, Unity,AutoFac.....关于它们的了解和下载都可以去开源网站http://www.oschina.net上获取。
StructureMap 是我自己唯一在项目中使用过的框架,所以下面是相关的使用代码,至于其他的方式,读者可以自己去探索。它是.NET环境下的一个轻量级依赖注入工具,StructureMap也是一个灵活的、可扩展的通用“插件”机制的.NET应用。
使用步骤:
1. 应用程序启用的时候初始化 对象容器,用于加载所有的对象映射和对象关联
1 void Session_Start(object sender, EventArgs e) 2 { 3 BootStrap.Init(); 4 }
2. 代码映射配置,也可以在xml文件中去配置。在这里就不说详谈使用方法了。
using System; using System.Linq; using FluentNHibernate; using FluentNHibernate.Cfg; using NHibernate; using StructureMap; namespace MedicalCare.IoCSetup { public static class BootStrap { public static void Init() { ObjectFactory.Initialize(x => { x.For<IScheduleAdaptor>().Use<ScheduleAdaptor>(); x.For<IUserInfoToUserMessage>().Use<UserInfoToUserMessage>(); x.For<IFamilyListToScheduleList>().Use<FamilyListToScheduleList>(); x.For<IUserLoginValidator>().Use<UserLoginValidator>(); } ); }
3. 类中获取对象接口实现的实例,说明只有在运行时才绑定具体的实现类对象,实现了一种解耦的操作
注意:其中的IScheduleAdaptor ,ScheduleAdaptor 分别是接口和接口的一种实现。
private IList<ScheduleEntity> CheckSchedule(ScheduleMessage message) { var scheduleAdaptor = ObjectFactory.GetInstance<IScheduleAdaptor>(); return scheduleEntityList; }