C# 如何在另一个类中获取当前控制器实例?
在我的项目中,我在这样的类中管理异常C# 如何在另一个类中获取当前控制器实例?,c#,asp.net-mvc,asp.net-mvc-3,controller,C#,Asp.net Mvc,Asp.net Mvc 3,Controller,在我的项目中,我在这样的类中管理异常 public class PortalBusinessExceptionManager :IBusinessExceptionManager { public void HandleBusinessException(BusinessExceptionDto exceptionDto) { //TODO } } 在我的项目中有一个BaseController,所有控制器都从中继承 public class
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;
}
}
然后在应用程序启动中注册它:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
您可以在异常处理方法中调用实例
public void HandleBusinessException(BusinessExceptionDto exceptionDto)
{
var controller= HttpContext.Current.Session["controllerInstance"] as BaseController;
if(controller != null)
{
controller.SetNotification();
}
}
请注意,这是一个非常粗糙的解决方案(例如,会话可能会过期,并且您的方法不会被调用),您最好在BaseController
中重写OneException
方法并在那里调用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();
//获取当前控制器实例
var控制器=DependencyResolver.Current.GetService();
//传递当前请求上下文
controller.ControllerContext=新的ControllerContext(Request.RequestContext,controller);
//调用方法
controller.MethodName();
最好放在de-HttpContext中。会话中插入的项目为什么要尝试将控制器用作类object@SatpalSingh我想在exceptionmanager类中调用SetNotification方法您的控制器不应该有这样的逻辑。您正处于发现的关键时刻,应该研究什么是服务层,以及如何使用它。为什么人们会投票反对?至少我愿意解释一下,我会一直接受争论。我开始觉得人们是故意这么做的。@ValipourHttpContext.Current
本身不是线程安全的。这是一个静态单态。此外,会话
使用起来并不安全,因为它是一种按用户、按会话的存储机制,这样做可能会妨碍控制器对象在多个请求中得到正确处理。这是一个糟糕的答案。