在我的项目中,我在像这样的类中管理异常
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();
}
答案 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