ASP.NET MVC扩展之IControllerFactory和IActionInvoker
大家知道ASP.NET MVC正式发布以来,受到开发人员的疯狂追捧,园子里MVC系列文章更是层出不穷,套用ASP.NET开发人员需要学习ASP.NET MVC么(英文地址)一文所说的:
朋友们,这可是件大事(至少对我来说):你工作在谎言中。Web是“无”状态的,它依赖一种叫做HTML的东西,并使用另一种叫做HTTP的东西通过电缆将HTML发来发去-你需要了解它、热爱它并在骨子里感受它。
这些都充分说明了使用MVC框架进行Web开发的必要性,至于更多的MVC和WebForms的特性,可以看看我无意中找到的一篇文章Asp.NET MVC and Asp.NET WebForms Features,至于更多关于这两者选择性问题我持保留意见,只能说合适的才是最好的,有一点我想事先说明一下,选择MVC能进行更多的控制但同时也意味着需要编写更多的代码(我是比较乐意的)。
最近在一个项目里使用了MVC开发,所以就阅读了一下MVC源码,真的非常棒,可扩展性非常强,可以说处处都可以扩展,Simone Chiaretta有篇文章被翻译了:【翻译】ASP.NET MVC中你必须知道的13个扩展点。
本文我将介绍扩展IControllerFactory的一个应用,通过扩展DefaultControllerFactory来实现Controller. ActionInvoker的替换,然后扩展IActionInvoker实现返回不同的ViewResult, 本文只实现一些简单的功能,仅当抛砖引玉。阅读之前你需要熟悉asp.net mvc具体流程,asp.net mvc流程初探虽然只是“初探”,但让你粗略了解asp.net mvc流程已经足够。
首先我们扩展IControllerFactory,让它替换ActionInvoker为我们自己扩展的TestControllerActionInvoker:
{


protected override IController GetControllerInstance(Type controllerType)
{
IController iController = base.GetControllerInstance(controllerType);//如果用到了依赖注入,可从注入容器获取
if (typeof(Controller).IsAssignableFrom(controllerType))
{
Controller controller = iController as Controller;
if (controller != null)
controller.ActionInvoker = new TestControllerActionInvoker();//同样可以从注入容器获取
return iController;
}
return iController;
}
}
然后扩展IActionInvoker:
{


protected override ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue)
{
if (actionReturnValue == null)
{
return new XXXResult();//可以处理自己的ViewResult逻辑
}
if (typeof(ActionResult).IsAssignableFrom(actionReturnValue.GetType()))
return actionReturnValue as ActionResult;
controllerContext.Controller.ViewData.Model = actionReturnValue;
//可以根据返回的类型返回进行相应的ViewResult
return new TTTResult { ViewData = controllerContext.Controller.ViewData, TempData = controllerContext.Controller.TempData };
}
}
这里只是简单的对IActionInvoker的管线中的Action方法执行后的返回值进行处理,当然IActionInvoker能扩展的地方非常多,这样的好处是你在具体的Action里不必把过多的精力放在View这一层面,可维护性和可扩展性也就上了一个层次了。
最后,别忘记对ControllerBuilder进行设置ControllerFactory操作:
好了本文就简单介绍到这,希望你能在自己的项目中根据自己的需要进行扩展,如果你项目中用到了依赖注入,需要对IControllerFactory进行扩展你可以参照MvcContrib和Ninject Controller Factory,至于ASP.NET MVC的IActionInvoker-ControllerActionInvoker主要任务是是查找Action、调用Action方法以及相关的Filter、执行得到ActionResult,可以说存在了大量的asp.net mvc执行逻辑,如果你需要改变这些约定,那就放开了去扩展吧,这里有个示例:NinjectActionInvoker I developed to allow injection of dependencies inside filters。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端