我没用过Castle Windsor IoC,但是理论上你应该可以创建一个自定义的Controller工厂类,然后通过在Global.asax中注册来指示MVC框架使用这个自定义的控制器工厂.css 文件,在 Application_Start 事件中:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactor());
}
[参见 Pro Asp.Net MVC 2 Framework,Steven Sanderson,Apress,第 64 - 66 页]
这样,您可以在代码中的任何位置实例化您的控制器。
不从“当前”控制器或其他代码调用另一个控制器的操作的概念是完全错误的。控制器只是类。它们只有在被 MVC 框架以特殊方式调用时才成为“控制器”。
因此,这件事的对与错归结为你为什么要这样做,而不是你是否应该这样做。
如果您只是将控制器用作类,那么这很好。如果您尝试使用它向用户发送响应,那么您应该使用上面建议的 RedirectToAction。
将控制器用作类而不是控制器的原因有很多。例如,在测试您的控制器时。因此,将控制器视为一个类是必要的,而不是错误的。
使用Controller作为类的非测试场景示例:
我正在编写一个迷你框架,它利用 MVC 框架的模板功能为 HTML 电子邮件生成 HTML,这是所有 Web 应用程序都需要做的事情,出于某种原因(例如,订单确认电子邮件)。
非常粗略地,您在 NormalController 的操作(需要发送电子邮件)中实例化 MailManagerController(为简单起见,假设您没有使用 IoC),然后执行以下操作:
MailManagerController mailmanager = new MailManagerController();
string html = mailmanager.OrderConfirmation(order).RenderToString();
Postman.SendEmail(html, order.UserEmailAddress, "MyApp order confirmation");
其中 RenderToString 是 ViewResultBase 上的扩展方法,它将 Action 的输出(返回 ViewResultBase 对象)呈现为字符串,而 Postman 是一个静态类,一旦您拥有文本就可以处理发送电子邮件。
这种技术的美妙之处在于您可以使用 MVC 框架来生成模板化的电子邮件,因为 OrderConfirmation Action 将有一个关联的视图,如果不是您要发送的电子邮件的 html 模板,它就什么都不是。