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

简介:

 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,而且你还会得到下面这个错误,如下图:

hhh

    产生上面错误的原因是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();
    }

}
运行结果如下:
hhhk 
总结:本文简单的介绍了一下自定义Controller Factory。下一篇文章将介绍ModelBinder。
参考:asp.net mvc 2 in action










本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/07/27/you-have-to-knowextensibility-points-in-asp-net-mvc-controller-factory.html,如需转载请自行联系原作者
相关文章
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
127 0
|
7月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
142 5
|
10月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
235 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
199 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
219 0
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
165 0
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
297 0
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
409 0
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
518 5
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
162 0