ASP.NET MVC学习笔记-----ControllerFactory

上面这张图是asp.net mvc的工作流程图,我们可以看到当一个http请求来临时,首先需要经过路由系统,路由系统从中获取一些路由信息,然后ControllerFactory根据所得到的路由信息生成相应的Controller。也就是说,ControllerFactory的作用就是根据路由信息生成相应的Controller。
1.ASP.NET MVC内置的ControllerFactory-----DefaultControllerFactory
在ASP.NET MVC框架中已经给我们提供了内置的ControllerFactory,即DefaultControllerFactory。它首先从routing data中获取到所请求的controller的名字,然后根据该名字去寻找相应的Controller。如果你希望一个类能被ControllerFactory当作Controller并生成需要遵循以下规则:
(1)该类的作用域必须为public
(2)该类必须可被实例化
(3)该类不能是泛型类
(4)该类的名称的结尾必须是Controller (这也是我们常说的约定大于配置)
(5)该类必须实现IController接口
利用DefaultControllerFactory指定命名空间优先级
如果我们希望DefaultControllerFactory在寻找Controller时都优先在指定的命名空间下寻找,我们可以利用它的DefaultNamespaces属性。不多说,看代码就明白了:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); ControllerBuilder.Current.DefaultNamespaces.Add("MyNamespace");
}
}
我们在Global.asax.cs中的Application_Start方法中添加最后一句代码,ControllerBuilder.Current属性返回的是当前的ControllerFactory(在这里就DefaultControllerFactory实例)。这样,DefaultControllerFactroy在寻找相应的Controller都优先在MyNamespace空间下寻找。如果在MyNamespace空间未找到,则继续在其他命名空间寻找。
2.使用自定义ControllerFactory
如果ASP.NET MVC内置的DefaultControllerFactory无法满足需求的话,我们可以自定义ControllerFactory来替代DefaultControllerFactory。
首先,一个ControllerFactory需要实现IControllerFactory接口:
public interface IControllerFactory
{
IController CreateController(RequestContext requestContext, string controllerName);
SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName);
void ReleaseController(IController controller);
}
其中CreateController方法是关键,它定义了一个ControllerFactory是如何根据信息寻找相应的Controller。而GetControllerSessionBehavior定义指定Controller的Session行为,ReleaseController 方法则是释放指定Controller。
下面来看一个例子吧:
public class CustomControllerFactory : IControllerFactory
{
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
//在这里,为了简单,我不管当前http请求信息是什么,都生成HomeController实例。
Type targetType = typeof(HomeController);
return (IController)DependencyResolver.Current.GetService(targetType);
} public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
{
//默认的Session行为
return SessionStateBehavior.Default;
} public void ReleaseController(IController controller)
{
IDisposable disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
在这个例子,不管http请求的信息是什么CustomControllerFactory都生成HomeController实例。
接着我们需要在Global.asax.cs的Application_Start方法中注册我们自定义的CustomControllerFactory:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
//注册自定义ControllerFactory
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());
}
}
现在,MVC使用的就是我们自定义的ControllerFactory了:无论请求信息是什么,生成的都是HomeController。
ASP.NET MVC学习笔记-----ControllerFactory的更多相关文章
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- ASP.NET MVC学习笔记-----Filter(2)
接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC学习笔记-----ActionInvoker
还是这张图: 当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行.ASP.NET MVC提供的基类Cont ...
- ASP.NET MVC 学习笔记(1)
从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...
- 【转】ASP.NET MVC学习笔记-Controller的ActionResult
1. 返回ViewResult public ActionResult Index() { ViewData["Message"] = "Welcome ...
- ASP.NET MVC学习笔记-----使用自定义的View Engine
我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...
随机推荐
- BCompare破解方法
1.删除 BCUnrar.dll 文件,重启软件. 备注:使用everything搜索BCUnrar.dll
- pyinstaller将python编写的打卡程序打包成exe
编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...
- python之GIL理解
GIL(Global Interpreter Lock) 全局解释器锁 python3中是假的多线程,它不是真正的并行,是利用了cpu上下文的切换而已.同一时间只能有一个线程使用共享数据,其它线程处于 ...
- Python中的字典详解
https://www.cnblogs.com/yjd_hycf_space/p/6880026.html
- group by 和count的联合使用问题 [转]
group by 和count的联合使用问题 今天写查询语句遇到一个问题,就是用group by进行分组以后,用count统计分组以后的个数, 开始写的语句大体是: select count(m.fb ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 作业一_随笔1_初来乍到:学号&博客地址
031302540——http://www.cnblogs.com/yyj031302540/ 计算机实验班叶艺洁
- css3-文本新增属性
rgba:a是设透明度值 应用:background:rgb(255,255,255,0.5) color:rgb(255,255,255,0.5) border:1px solid rgb(255, ...
- 获得用户的真实IP地址
/** * 获得用户的真实IP地址 * * @access public * @return string */if (!function_exists('get_real_ip')){ functi ...
- Codeforces 68D - Half-decay Tree
题意 有一颗高度为 \(h\) 的完全二叉树(即点数为 \(2^{h+1}-1\) ),有两种操作: add x y 给 \(x\) 点的权值加 \(y\) decay 一次衰变定义为选择一个叶子节点 ...