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应用的更多相关文章

  1. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  2. 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...

  3. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  4. 快速入门系列--MVC--07与HTML5移动开发的结合

    现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...

  5. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  6. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  7. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...

  8. WPF快速入门系列(4)——深入解析WPF绑定

    一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...

  9. WPF快速入门系列(1)——WPF布局概览

    一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...

  10. Qt快速入门系列教程目录

    Qt快速入门系列教程目录

随机推荐

  1. Eclipse中支持js提示

    使用eclipse自带的插件,无需另外安装插件,具体步骤如下 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Act ...

  2. C++内存对齐的理解

    程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式. 编译器中提供了#pragma pack(n)来设 ...

  3. Sqlite 管理工具收藏

    1.SQLite Administrator   http://download.orbmu2k.de/files/sqliteadmin.zip 2.SQLite2009Pro-v3.8.3.1 h ...

  4. innodb buffer pool相关特性

    背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer po ...

  5. Android 自定义ViewGroup

    前面几节,我们重点讨论了自定义View的三板斧,这节我们来讨论自定义ViewGroup,为什么要自定义ViewGroup,其实就是为了更好的管理View. 自定义ViewGroup无非那么几步: Ⅰ. ...

  6. node.js初学遇到的问题

    是用express安装一个网站基础架构时 express -t ejs microblog 但是出来的模板引擎是jade,通过修改js也修改模板引用npm install 等等修改了index.ejs ...

  7. entityframework使用oracle的几个小问题

    问题一:Operation is not valid due to the current state of the object 生成的edmx文件有问题,解决方法参考链接 问题二:InvalidO ...

  8. 为什么要放弃使用Thread.Sleep

    前言 此文并不是说要完全放弃使用Thread.Sleep,而是要说明在符合哪些情况下使用! 场景 很多时候,我们会需要一个定时服务来处理业务. 但并不是死死的每隔N分钟执行一次那种,而是在一次处理完后 ...

  9. ENode 1.0 - 消息的重试机制的设计思路

    项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路 ...

  10. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...