使用自定义IControllerFactory实现在MVC 6中手动创建控制器

时间:2015-05-11 12:38:00

标签: asp.net-mvc asp.net-core-mvc

基于that post我创建了自定义控制器工厂,用于根据某些逻辑实例化控制器(用于制作可插拔架构)。

出于测试目的,一切都是硬编码的。

var controller = Bootstrapper.GetInstance<Controller>("TestModuleApi");

actionContext.RouteData.Values["controller"] = "TestModuleApi";
actionContext.RouteData.Values["action"] = "Get";
var returnController = _controllerActivator.Create(actionContext, controller.GetType());

return returnController;

Boostrapper.GetInstance()从带有导出控制器的文件夹中获取MEF的控制器实例。

当我打开默认路由Home / Index时,代码将在此处运行,returnController变量是所需控制器的实例。即使我收到错误说

An unhandled exception occurred while processing the request.

InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/TestModuleApi/Index.cshtml
/Views/Shared/Index.cshtml.

我也试过非常简单的方法让CreateController返回我想要的东西:

actionContext.RouteData.Values["controller"] = "MyApi";
actionContext.RouteData.Values["action"] = "Get";

return new MyApiController();

这里我将覆盖每次调用CreateController以返回MyApiController实例。在这种情况下,MyApiController会继承HomeApiController。我仍然以/api/HomeApi/Get为例,从HomeApiController获取值,而不是MyApiController

如何在自定义IControllerFactory实现中实例化我们想要的控制器实例?

UPDATE:当我调试第一个代码时,我可以看到TestModuleApiController的构造函数被调用,但Get动作从未被调用。

0 个答案:

没有答案