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

本文关键字:控制器 实例 获取 另一个 | 更新日期: 2023-09-27 18:07:32

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

 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(); 
}

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

根据这个问题的答案,您可以创建自己的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;
    }
}

然后注册到application_start:

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

你可以在你的异常处理方法中调用实例。

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

请注意,这是一个相当hacky的解决方案(会话可能会过期,例如,你的方法不会被调用),你可能应该更好地覆盖OnException方法在你的BaseController和调用SetNotification那里

public class BaseController : Controller
{
    public void SetNotification(string message, ExceptionType type)
    {
       //TO DO
    }
    protected override void OnException(ExceptionContext filterContext)
    {
        SetNotification(filterContext.Exception.Message, yourExceptionType);
        base.OnException(filterContext);
    }
}

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

// 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();

最好放在de HttpContext中。Items instead Session