专栏首页熊二哥快速入门系列--MVC--03控制器和IOC应用

快速入门系列--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的组合也很好。

 1 public class UnityDependencyResolver : IDependencyResolver
 2 {
 3 IUnityContainer _container;
 4 public UnityDependencyResolver(IUnityContainer container)
 5 {
 6 _container = container;
 7 }
 8 
 9 public object GetService(Type serviceType)
10 {
11 object instance;
12 try
13 {
14 instance = _container.Resolve(serviceType);
15 if (serviceType.IsAbstract || serviceType.IsInterface)
16 {
17 return null;
18 }
19 return instance;
20 }
21 catch (Exception e)
22 {
23 return null;
24 }
25 }
26 
27 public IEnumerable<object> GetServices(Type serviceType)
28 {
29 return _container.ResolveAll(serviceType);
30 }
31 }

参考:

[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012. 86-122

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 常用工具(Windows版本)

    为原有版本修改为markdown后的更新,这个编辑器真心不错,只需要把原来喜欢的表格改成列表即可。 代码工具 代码管理工具 SourceTree:支持wi...

    用户1216676
  • 《大型网站技术架构》学习笔记-01概述

    李智慧老师的大型网站架构已经买了两年了,之前大体看过一次,不过还未内化为自己的本领,最近项目空闲,决定尽力掌握这部分的知识,以跟上大师的节奏。今天是儿童节,祝自...

    用户1216676
  • 《大型网站技术架构》学习笔记-02架构篇

    上一篇文章已经介绍了网站系统最需要关注的5大质量属性,接下来对这些特性进行详细介绍(这部分有部分内容会显得有些陈旧,之后会进行更新)。 ? 高性能架构 网站...

    用户1216676
  • 轻量级Qt键盘-实现篇

    Qt君
  • Vmware网络不可达

    声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%...

    对弈
  • 消息中间之ActiveMQ

    JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS(JAV...

    HUC思梦
  • Flutter 裁剪类组件 最全总结

    ClipRect组件使用矩形裁剪子组件,通常情况下,ClipRect作用于CustomPaint 、 CustomSingleChildLayout 、 Cus...

    老孟Flutter
  • Flutter 裁剪类组件 最全总结

    ClipRect组件使用矩形裁剪子组件,通常情况下,ClipRect作用于CustomPaint 、 CustomSingleChildLayout 、 Cus...

    老孟Flutter
  • C# 正则进阶

    从 .NET Framework 4.5 开始,正则表达式支持在匹配操作中指定超时时间。如果匹配超时,就会抛出 RegexMatchTimeoutExcepti...

    丹枫无迹
  • bootstrap 弹出框 显示详细内容 常用样式

    <div class="container" style="padding: 100px 50px 10px;" > <button type="but...

    用户5760343

扫码关注云+社区

领取腾讯云代金券