gpt4 book ai didi

c# - 如何在另一个类中获取当前 Controller 实例?

转载 作者:行者123 更新时间:2023-11-30 15:00:08 27 4
gpt4 key购买 nike

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

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

我的项目中有一个BaseController,所有 Controller 都继承自它

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

所以我想在 HandleBusinessException 方法中如何从当前 Controller 获取实例并为其调用 SetNotification

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

最佳答案

来自这个 question 的答案您可以创建自己的 ControllerFactory 并将 Controller 实例放入 session 中以供以后检索。

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

请注意,这是一个非常 hacky 的解决方案(例如, session 可能会过期并且您的方法不会被调用),您最好在 BaseController 中覆盖 OnException 方法> 并在那里调用 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);
}
}

关于c# - 如何在另一个类中获取当前 Controller 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15805296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com