基于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
动作从未被调用。