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,而且你还会得到下面这个错误,如下图:
![]()
产生上面错误的原因是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
Asp.net MVC2中你必须知道的扩展点(一):Controller Factory的更多相关文章
- [转]Asp.net Mvc2中重构View的三种方式
本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...
- ASP.NET MVC2中Controller向View传递数据的三种方式
转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...
- 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session
一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...
- ASP.NET MVC中的Json Binding和Validate
引子:电子商务网站支付功能页面往往会有很多信息,对于这些信息的保存,往往是分步完成的,那么使用Ajax最合适不过了,比如其中的收货人信息模块.这些信息的新建和编辑保存都是用Ajax来完成的.那么有几种 ...
- ASP.NET MVC 中使用用户控件——转
讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件, 我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...
- ASP.NET MVC中使用Ninject
ASP.NET MVC中使用Ninject 在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事 ...
- Asp.net MVC 中使用 Ninject 实现依赖注入
松耦合.针对抽象编程.不针对实现编程是面向对象设计的原则.依赖注入就是,在一个类的内部,不通过创建对象的实例而能够获得实现了某个公开接口的对象引用.所谓的控制反转也是相同的意思.把依赖的创建转移到了使 ...
- ASP.NET MVC3中Controller与View之间的数据传递总结
一. Controller向View传递数据 1. 使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
随机推荐
- HDU4619+匈牙利
/* 匈牙利算法 二分匹配 最小点覆盖=最大匹配. 即踢掉最小点覆盖 */ #include<stdio.h> #include<string.h> #include<s ...
- c#问答篇:对象与引用变量-----初学者的困惑
转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html 从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone ...
- DHTMLX 前端框架 建立你的一个应用程序教程(三)--添加一个菜单
菜单的介绍 这篇我们介绍将菜单组建添加到上节中的布局中: 我们不对菜单做任何处理 只是在这里填充作为界面的一部分. 这里我们介绍的是dhtmlxMenu 组件. 这个组件的数据我们可以从XML或者J ...
- Android源码是这样搞到的(图解)
Android学习到一定程度,就一定要多读代码多思考,Android源码就是很好的学习材料,本文就是把Android的源码下载下来.我们知道Android的源码是用Git这个分布式版本号控制工具管理的 ...
- DTrace patch for Python 2.7.x and 3.x
DTrace patch for Python 2.7.x and 3.x Última Actualización: 21 de septiembre de 2015 https://www.jce ...
- web工程中spring+ibatis的单元测试--转载
为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...
- Android开发--UI之Bundle的使用
Android开发–UI之Bundle的使用 最近,把之前学过的东西大体的整理了以下,并且想把学过的心得分享给大家.我自己做了一个小小的demo,以便说明具体的应用. 这里的两个界面是通过第一个界面输 ...
- 如何在Linux上安装Storm
Storm是开源的分布式实时计算系统,能够让数据流处理变得简单.可靠,也因此在大数据领域有广泛的实际 应用.下面介绍一下如何在Linux系统上安装Storm.根据Storm官网介绍,安装Storm软件 ...
- su: cannot set user id: Resource temporarily unavailable
今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...
- jquery登录验证插件
最近写了个登录验证的jquery插件,其中功能还不是很完善,需要进一步改进,先放出来看看先. /** * 功能描述:本模块实现普通网站登录验证,以后可以添加二维码验证,以及第三方帐号登录验证 * 关联 ...