如何在另一个类中获取当前控制器实例
本文关键字:控制器 实例 获取 另一个 | 更新日期: 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