如何在另一个类中获取当前控制器实例?

时间:2013-04-04 07:44:05

标签: c# asp.net-mvc asp.net-mvc-3 controller

在我的项目中,我在像这样的类中管理异常

 public class PortalBusinessExceptionManager
    :IBusinessExceptionManager
{
    public void HandleBusinessException(BusinessExceptionDto exceptionDto)
    {
        //TODO
    }
}

我的项目中有一个BaseController,所有控制器都从它继承

public class BaseController : Controller
{
    public void SetNotification(string message, ExceptionType type)
    {
       //TO DO
    }
}

所以我希望在HandleBusinessException方法中如何从当前控制器获取实例并为其调用SetNotification

 public void HandleBusinessException(BusinessExceptionDto exceptionDto)
{
    var controller=....???
     controller.SetNotification(); 
}

3 个答案:

答案 0 :(得分:4)

根据此question的答案,您可以创建自己的ControllerFactory并将控制器实例放入会话中以供日后检索。

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        var controller = base.CreateController(requestContext, controllerName);
        HttpContext.Current.Session["controllerInstance"] = controller;
        return controller;
    }
}

然后在Apllication_Start中注册它:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

您可以在异常处理方法中调用该实例。

public void HandleBusinessException(BusinessExceptionDto exceptionDto)
{
     var controller= HttpContext.Current.Session["controllerInstance"] as BaseController;
     if(controller != null) 
     {
         controller.SetNotification(); 
     }
}

请注意,这是一个非常糟糕的解决方案(例如,会话可能会过期并且您的方法不会被调用),您应该更好地覆盖OnException中的BaseController方法并调用{{1

SetNotification

答案 1 :(得分:0)

不确定它是否解决了您的问题,但它可能会有所帮助:

// get current controller instance
var controller = DependencyResolver.Current.GetService<MyController>();
// pass current request context
controller.ControllerContext = new ControllerContext(Request.RequestContext, controller); 
// call method
controller.MethodName();

答案 2 :(得分:0)

最好放入de HttpContext.Items insted Session