原理:IOC容器用Dictionary<Type, Type>实现,获取服务时根据键获取值,然后根据值的ConstructorInfo去实例化一个对象,这就实现了根据服务接口去获取服务实例的功能。那么如何实现对Webform及页面控件的依赖注入呢?我们可以利用IHttpModule。自己实现一个IHttpModule,Init函数里,订阅HttpApplication的PreRequestHandlerExecute,在OnPreRequestHandlerExecute函数里拦截System.Web.UI.Page实例,对该实例进行注入,也就是对该实例的所有公共属性进行遍历,然后访问这些属性的自定义Attribute,看是否打上了注入的标签,如果打上了注入标签,说明该属性需要进行注入。然后根据需要注入的属性的Type去跟IOC容器要匹配的服务实例,再然后把得到的服务实例用PropertyInfo的SetValue对该属性进行赋值,也就是注入了。接下来就是对页面所有控件的依赖注入,其实就是一个递归的过程,递归控件,访问控件公共属性,确定是否需要注入,注入的服务实例也可能存在依赖,也需要对这些对象进行依赖检查,其实也是一个递归的过程,做完这些,所有的注入工作就完成了。在这里展示的,只是实现IOC注入的一个思路,这些代码用到生产上肯定不行,还需要进行许多的改造。其实实现IOC注入一个最关键的一点就是:知道在什么地方、什么时候拦截需要注入的对象,然后对该对象进行注入,如果要实现构造函数的注入,则要赶在系统实例化该对象前自己替系统实现对象的实例化。原理就这么一点点。废话不多说,具体看代码,代码实现胜却千言万语。大家有什么好想法也可说出来分享。感谢大家捧场。