ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]

[上篇]除了通过自定义ControllerFactory的方式引入IoC之外,在使用默认DefaultControllerFactory情况下也可以通过一些扩展使基于IoC的Controller激活成为可能。主要的方式就是自定义ControllerActivator和 DependencyResolver。

四、ControllerActivator V.S. DependencyResolver

如下面的代码片断所示,DefaultControllerFactory具有两个构造函数重载,其中一个具有一个类型为IControllerActivator接口的参数,我们将实现了该接口得类型统称为ControllerActivator。

   1: public class DefaultControllerFactory : IControllerFactory   2: {   3:     //其他成员   4:     public DefaultControllerFactory();   5:     public DefaultControllerFactory(IControllerActivator controllerActivator);   6: }

顾名思义,ControllerActivator就是Controller的“激活器”,Controller的激活实现在唯一的Create方法中。如下面的代码所示,该方法具有两个参数(requestContext和controllerType),分别代表当前请求上下文和解析出来的目标Controller的类型。

   1: public interface IControllerActivator   2: {   3:     IController Create(RequestContext requestContext, Type controllerType);   4: }

在默认的情况下(调用DefaultControllerFactory默认构造函数或者指定的参数为Null),Controller激活系统 会默认使用一个类型为DefaultControllerActivator的对象。如下面的代码片断所示,DefaultControllerActivator是一个实现了IControllerActivator私有类型而已,我们不能直接通过编程的方式使用它。

   1: private class DefaultControllerActivator : IControllerActivator   2: {   3:     public DefaultControllerActivator();   4:     public DefaultControllerActivator(IDependencyResolver resolver);   5:      public IController Create(RequestContext requestContext,  Type controllerType);   6: }

DefaultControllerActivator的构造函数具有一个类型为IDependencyResolver的参数,这是一个重要的接口,我们将实现了该接口的类型统称为DependencyResolver。。如下面的代码片断所示,IDependencyResolver接口具有两个方法GetService和GetServices,用于根据指定的类型获取单个或者多个实例。实际上DefaultControllerActivator就是通过调用GetService方法获取具体的Controller对象的

   1: public interface IDependencyResolver   2: {   3:     object GetService(Type serviceType);   4:     IEnumerable<object> GetServices(Type serviceType);   5: }

如果在构造DefaultControllerActivator对象的时候传入的参数为Null,那么Controller激活系统会使用通过DependencyResolver的静态只读属性Current表示DependencyResolver。需要提醒的是,DependencyResolver类型没有实现IDependencyResolver接口,而是对一个实现了IDependencyResolver接口类型对象的封装。

   1: public class DependencyResolver   2: {   3: private static DependencyResolver _instance;   4:   5:     public void InnerSetResolver(object commonServiceLocator);   6:     public void InnerSetResolver(IDependencyResolver resolver);   7:     public void InnerSetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);   8:   9:     public static void SetResolver(object commonServiceLocator);  10:     public static void SetResolver(IDependencyResolver resolver);  11:     public static void SetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);  12:  13:     public static IDependencyResolver Current { get; }  14:     public IDependencyResolver InnerCurrent { get; }  15: }

这个被封装的DependencyResolver(指实现了接口IDependencyResolver的某个类型的类型,不是指DependencyResolver类型的对象,对于后者我会采用“DependencyResolver类型对象”的说法)通过只读属性InnerCurrent表示,而三个InnerSetResolver方法重载用于初始化改属性。静态字段_instance表示当前的DependencyResolver类型对象,静态只读属性Current则表示该对象内部封装的DependencyResolver对象,而它通过三个静态的SetResolver进行初始化。

如果我们不曾通过调用DependencyResolver的静态方法SetResolver通过Current属性表示的当前DependencyResolver进行显示设置,该属性默认返回一个DefaultDependencyResolver对象。如下面的代码片断所示,DefaultDependencyResolver是一个实现了IDependencyResolver接口的私有类型,在实现的GetService方法中,它直接通过根据指定的类型以反射的形式创建相应的对象并返回,所以前面我们说DefaultControllerFactory根据解析出来的Controller类型以反射的形式创建对应的实例在这里得到了印证。至于GetServices方法则返回一个空对象集合。

   1: private class DefaultDependencyResolver : IDependencyResolver   2: {   3:     public object GetService(Type serviceType)   4:     {   5:         if (serviceType.IsInterface || serviceType.IsAbstract)   6:         {   7:             return null;   8:         }   9:         try  10:         {  11:             return Activator.CreateInstance(serviceType);  12:         }  13:         catch  14:         {  15:             return null;  16:         }  17:     }  18:  19:     public IEnumerable<object> GetServices(Type serviceType)  20:     {  21:         return Enumerable.Empty<object>();  22:     }  23: }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 接口
, controller
, 类型
, public
, getservice
, 一个
, 反射的详解
controllers详解
,以便于您获取更多的相关知识。

时间: 2024-08-04 07:02:52

ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]的相关文章

ASP.NET MVC Controller激活系统详解:默认实现

Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前ControllerBuilder的SetControllerFactory方法),默认使用的是一个DefaultControllerFactory对象,我们现在就来讨论实现在DefaultControllerFactory类型中的默认Controller激活机制. 一.Controller类型的解析 激活

ASP.NET MVC Controller激活系统详解:总体设计

我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统.在正式讨论Controller对象具体是如何被创建爱之前,我们先来看看Controller激活系统在ASP.NET MVC中的总体设计,了解一下组成该子系统的一些基本的组件,以及它们对应的接口或者抽象类是什么. 一.Controller 我们知道作为Controller的类型直接或者间接实现了IController接口.如下面的代码片断所示,I

ASP.NET MVC Controller激活系统详解:IoC的应用[上篇]

所谓控制反转(IoC: Inversion Of Control)简单地说就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转.比如在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,而是通过外部容器来创建.通过IoC的方式是实现针对目标Controller的激活具有重要的意义. 一.从Unity来认识IoC 有时我们又将IoC称为依赖注入(DI: Dependency Injection).所谓依赖注入,

ASP.NET MVC数组模型绑定详解_实用技巧

在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name="[0].Name" /> <input type="text" name="[1].Name" /> <input type="text" name="[2].Name" />

Win8激活方式详解

Windows的用户恐怕都绕不开一个问题,那就是激活.最近,尝鲜Win8的用户越来越多,但漂在屏幕上的激活提醒实在让人看了很不爽,因此关于Win8激活的问题又开始成为了网上热门的话题. 今天笔者就将详细地介绍一下Win8的激活方法,大家只要照着步骤一步步进行操作,相信都可以完成Win8的激活. 网络常规激活 Win8的激活方法目前有两种较为方便的,一种为联网激活,还有一种为电话激活,主要应对在断网环境下激活系统.首先我们来看看联网激活. 在Win7和之前的XP版本中,我们一般会右击"我的电脑&q

AngularJS tab栏实现和mvc小案例实例详解

tab栏: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Tab 标签</title> <style> body { margin: 0; padding: 0; background-color: #F7F7F7; } .tabs { width: 400px; margin: 3

.NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4.ASP.NETMVC ControllerBuilder 控制器创建入口设置 5.ASP.NETMVC 自定义IControllerFactory 1]开篇介绍 上一篇文章".NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)"详细的讲解了MvcH

ExtJS 4.2 教程-08:布局系统详解

ExtJS 4.2 系列教程导航目录: ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 教程-02:bootstrap.js 工作方式 ExtJS 4.2 教程-03:使用Ext.define自定义类 ExtJS 4.2 教程-04:数据模型 ExtJS 4.2 教程-05:客户端代理(proxy) ExtJS 4.2 教程-06:服务器代理(proxy) ExtJS 4.2 教程-07:Ext.Direct ExtJS 4.2 教程-08:布局系统详解 今天我们来对

asp.net iis URLRewrite 实现方法详解

原文 asp.net iis URLRewrite 实现方法详解 实现非常简单首先你要在你的项目里引用两个dll:actionlessform.dll.urlrewriter.dll,真正实现重写的是 urlrewriter.dll   但是如果你要实现分页,那么必须使用这个actionlessform .dll.文件下载见文章底部.现在来看操作步骤: 第一步,下载组件,把urlrewriter.dll 复制到你的项目 bin 目录下. 第二步,在web.config中的<configurati