快速业务通道

Asp.net MVC2中你必须知道的扩展点(一):Controller Factory

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

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)
     {
         retur

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号