快速入门系列--MVC--03控制器和IOC应用
Asp.net MVC也接触好久了,但由于自己一直主要负责后台,尤其是数据库方面的工作对于该框架并没有一个很好的了解,尤其是蒋金楠大师的ASP.NET MVC4框架剖析一书都买了2年多了,真正认真看过并实践过的也就第一章而已。最开始的时候还老认为这本书不好,又厚又晦涩,不容易坚持读完,现在回想起来都觉得羞愧。标准的徒弟不好怪师傅的心态,当然学习的确需要一个过程,从浅入深会越来越喜欢。到目前为止,我最喜欢的书籍系列依然是入门经典系列,内容简单有习题,方便记忆与实践。最近有一段学习JAVA的过程,让我慢慢开始学着阅读源码,这才知道蒋大师是源码级别的剖析,并且比很多相关书籍好的地方时,基本上每一个复杂的知识点他都会根据自己的理解创建一个相对简单的小例子促进读者的理解,真心是棒棒哒。闲扯了半天,进入今天的正题—ASP.NET MVC与IOC的相关实践。
首先由于IOC是在Controller这章介绍,所以先来说说Controller方面的相关知识。ASP.NET MVC框架的主要的处理过程就是通过解析URL信息获取Controller的名称和Action的名称,同时通过Model的绑定机制将请求上下文所包含的请求数据转化为Action方法调用的参数列表。这儿想提及的一点就是关于Controller的执行是同步的还是异步的,实际上默认情况下是异步的,其中DisableAsyncSupport属性负责控制,默认为false,我之前为这块也困惑了很久。接下来提及的是ControllerFactory类中的SessionStateBehavior属性,有Default、Required、ReadOnly、Disable,到目前为止,我对于该框架中的会话仍然不是特别的清楚,之后弄清后回过来修改。
接下来用简图表示Controller激活的基本过程,请求到来后,HttpModule进行拦截,通过MvcRouteHandler调用GetHttpHandler方法找到对应HttpHandler处理类,即MvcHandler。然后调用该类的异步处理方法,注意这儿会始终使用异步处理方式,该方法中首先通过ControllerBuilder对象获取当前的ControllerFactory,然后通过控制器的名称找到并创建该控制器,让后调用[Begin]Execute执行,可以异步也可以是同步执行,之前有提及。Controller在执行完后,ControllerFactory会调用Release将其释放。

再则说说Controller类型的缓存,为了提高解析Controller的效率,框架对其进行了缓存,是一种XML文件形式的缓存,可以%Windir%\Micrisoft.NET的相关子目录中找到,与AreaRegistration的缓存方式类似,需要时将该XML文件反序列化为一个List<Type>对象即可。
最后介绍,本文的重点Controller中IOC的应用。在此之前,需要介绍一下应用IOC的原因,在实际的开发过程中,用户的请求会直接发送到Controller,这是如果是针对某项业务功能的调用,Controller会直接调用Model(也可以是外部的Service),当需要呈现数据时,回见Model中获得数据转化为ViewModel的形式用于呈现。但不管怎样,Controller都会与业务层的Model(领域模型)产生直接的依赖,不复合程序设计中依赖倒置的原则,因此引入IOC,降低耦合性。

在IOC的应用上,我们选择框架默认的DependencyResolver组件与Unity组件的组合,当前Unity组件已从codeplex搬到了github。有一个UnityMvc包原生支持IOC都不需要代码,直接配置即可,但由于版本兼容原因,附实现的代码如下,相关内容比较简单,就不介绍了。这儿的重点是相关整合方案有很多,这种是被使用最多的,当然蒋老师介绍的与Ninject的组合也很好。
public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
} public object GetService(Type serviceType)
{
object instance;
try
{
instance = _container.Resolve(serviceType);
if (serviceType.IsAbstract || serviceType.IsInterface)
{
return null;
}
return instance;
}
catch (Exception e)
{
return null;
}
} public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType);
}
}
参考:
[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012. 86-122
快速入门系列--MVC--03控制器和IOC应用的更多相关文章
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- Qt快速入门系列教程目录
Qt快速入门系列教程目录
随机推荐
- nginx切割日志
#!/bin/bash ## Nginx 日志文件所在的目录 LOGS_PATH=/usr/local/nginx/logs ## 获取昨天的 yyyy-MM-dd YESTERDAY=$(date ...
- JavaWeb开发学习(一)-JavaWeb开发概述
1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网 ...
- HTML5-列表的使用
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Swift不同storyboard之间的交互
如何实现多个Storyboard之间的切换 正如大家所知道的,Main-board是·程序运行的入口,如果找不到就会抛出异常,打开plist文件可以看到关于Main-board的描述,特别的制定了其b ...
- Async and Await 异步和等待
[第一次这么耐下性子认真写博客,虽然觉得很认真了,当毕竟是第一次嘛,以后再看肯定觉得很不咋滴的,更何况园子里有那么多的高人和大侠,这篇文章就权当练练手了,熟悉一下用客户端发表博客了,也希望大家多多照顾 ...
- node(邮件发送特性)
1.安装 npm install nodemailer https://github.com/andris9/Nodemailer 2.配置发邮件的账户开启SMTP功能: 3.程序样例如下: var ...
- 去它的h5,我还是用js写原生跨平台app吧
智能手机功能越来越强大,已经在逐渐替代电脑的作用.百度.腾讯.阿里的移动端日活数也在逐步的赶上甚至超越电脑端用户.叫喊着“mobile first”的公司越来越多,App开发者应运而生,且队伍日趋庞大 ...
- zendframework 2 链接数据库
相对于zf1,来说,zf2让我们对于数据库这方面的操作我的个人感觉是对于字段起别名简单了,但是对数据库的操作虽然配置写好的就基本不需要动了,但是还是比1的配置要繁琐, 还是那句话,大家可以去看看源码. ...
- SQL Server内存理解的误区
SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...
- SlipHover,能感知鼠标方向的图片遮罩效果jQuery插件
接上一篇博文,介绍完jQuery插件开发后这里上一个自己的作品,也是初次实践,小有成就的感觉. 话说这个插件年前就写好了,然后挂到GitHub,然后就偷偷看着Google Analysis心中暗自激动 ...