Asp.net mvc2中提供很多可以扩展的地方,利用这些扩展之后,asp.net mvc使用起来更加灵活。Simone Chiaretta曾写过一篇文章:13 ASP.NET MVC extensibility points you have to know。文章中概括性的介绍了13个asp.net mvc开发人员必须知道的扩展点。我将从这13个扩展点中挑选几个常见的重要的扩展点进行详细的介绍。这篇将文章将首先介绍Controller Factory。

Controller Factory是Asp.MVC框架中一个重要的扩展点。Controller Factory是用来创建控制器。而Controller最常用的场景之一是支持依赖注入。但是如果直接在控制器中使用依赖注入,默认情况下asp.net mvc框架将不会为你创建Controller,而且你还会得到下面这个错误,如下图:

产生上面错误的原因是DefaultControllerFactory使用Activator.CreateInstance来初始化控制器,而这个方法对你依赖注入的参数一无所知。

这种情况下,我们就要使用自定义的Controller Factory。

一个自定义的Controller Factory需要继承IControllerFactory或者继承过IControllerFactory的类,如:DefaultControllerFactory。下面代码是一个自定义的Controller factory。

public class MyCustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
/* implement controller creation logic */
return base.GetControllerInstance(requestContext, controllerType);
}
}

在定义Controller Factory之后,需要在Application_Start()中注册一下:

ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory());

这样MVC框架将会使用你自定的Controller Factory创建Controller。

看下面这个ProductsController,这个控制器在构造函数中接受依赖注入

public class ProductsController : Controller
{
public ProductsController(IProductRepository repository,IShippingCalculator shippingCalculator, ITaxService taxService)
{
/* ... */
}
/* ... */
}

如果自己手动写代码创建这样的Controller是非常乏味的。幸运的是我们不需要自己手写代码去实现。因为存在很多IoC工具供我们使用。在.net中最好的依赖注入工具之一便是StructureMap,它是一个轻量级开源免费IOC框架。下面我将使用这个工具实现一个简单的MVC中依赖注入的Demo。

1、到http://structuremapsourceforge.net/上下载这个工具。在MVC项目中引用StructureMap.dll。

2、在Models中定义一个依赖注入的IMessageProvider接口,以及它的一个实现类StructureMapMessageProvider。

namespace MvcApplication1.Models
{
public interface IMessageProvider
{
string GetMessage();
} public class StructureMapMessageProvider : IMessageProvider
{
public string GetMessage()
{
return "This message was provided by StructureMap";
}
}
}

3、利用StructureMap自定义的Controller Factory代码如下:

public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ObjectFactory.GetInstance(controllerType) as IController;
}
}

4、定义一个静态类StructureMapBootstrapper,用来初始化StructureMap和设置StructureMapControllerFactory为项目的Controller Factory,代码如下:

public static class StructureMapBootstrapper
{
public static void Initialize()
{
ObjectFactory.Initialize(x => x.AddRegistry(new MyStructureMapApplicationRegistry()));
} public static void SetControllerFactory()
{
var controllerFactory = new StructureMapControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}

5、在Global.asax中使用上面的StructureMapBootstrapper类设置Controller Factory和初始化StructureMap。

StructureMapBootstrapper.SetControllerFactory();
StructureMapBootstrapper.Initialize();

6、这样我们就能正常使用了。我们将HomeController设置如下:

[HandleError]
public class HomeController : Controller
{
private IMessageProvider _messageProvider; public HomeController(IMessageProvider messageProvider)
{
_messageProvider = messageProvider;
} public ActionResult Index()
{
ViewData["Message"] = _messageProvider.GetMessage(); return View();
} }
运行结果如下:
 
总结:本文简单的介绍了一下自定义Controller Factory。下一篇文章将介绍ModelBinder。
参考:asp.net mvc 2 in action
作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Asp.net MVC2中你必须知道的扩展点(一):Controller Factory的更多相关文章

  1. [转]Asp.net Mvc2中重构View的三种方式

    本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...

  2. ASP.NET MVC2中Controller向View传递数据的三种方式

    转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...

  3. 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session

    一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...

  4. ASP.NET MVC中的Json Binding和Validate

    引子:电子商务网站支付功能页面往往会有很多信息,对于这些信息的保存,往往是分步完成的,那么使用Ajax最合适不过了,比如其中的收货人信息模块.这些信息的新建和编辑保存都是用Ajax来完成的.那么有几种 ...

  5. ASP.NET MVC 中使用用户控件——转

    讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件,   我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...

  6. ASP.NET MVC中使用Ninject

    ASP.NET MVC中使用Ninject 在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事 ...

  7. Asp.net MVC 中使用 Ninject 实现依赖注入

    松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...

  8. ASP.NET MVC3中Controller与View之间的数据传递总结

    一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...

  9. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

随机推荐

  1. DDD的好文章

    http://www.jdon.com/44815   //cqrs 架构 http://www.jdon.com/tags/272 解道领域驱动专题

  2. android107 指针入门

    #include <stdio.h> #include <stdlib.h> //指针就是内存地址 //32为操作系统最大是4G内存,32为系统则是2的32次方, //所以只能 ...

  3. 进程环境之main函数

    C程序总是从main函数开始执行.main函数的原型是: int main( int argc, char *argv[] ); 其中,argc是命令行参数的数目,argv是指向参数的各个指针所构成的 ...

  4. find——文件查找命令 linux一些常用命令

    find 命令eg: 一般文件查找方法: 1.  find /home -name file  ,  在/home目录下查找文件名为file的文件2.  find /home -name '*file ...

  5. mysql内存使用情况

    可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析 ...

  6. java Spring集合

    在进行输入的时候一定要给属性配置set方法,因为不设置是注入不了的. 1.list UserService.java private ArrayList arr; public ArrayList g ...

  7. MongoDB 2.6.x 的安装部署

    1. 下载mongodb 2.6.x版本的zip包,在D盘创建目录MongoDB,解压缩到D:\MongoDB目录. 创建数据库目录D:\MongoDB\data,接下来打开命令行窗口,切换到D:\M ...

  8. SQL Server自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  9. WinEdit7 破解方法

    最近遇到了winEdit7 超过试用期的问题,找了下解决方案. 这个靠谱,通过在每次退出时自动删除注册表信息,达到无限试用的目的: https://lttt.blog.ustc.edu.cn/2012 ...

  10. Oracle中用一张表的字段更新另一张表的字段

    今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的. 那么,有什么办法能将测试库中该字段的值更新到开发库中呢? SQL Server中这是比较容易解决的,而O ...