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方法您的控制器不应该有这样的逻辑。您正处于发现的关键时刻,应该研究什么是服务层,以及如何使用它。为什么人们会投票反对?至少我愿意解释一下,我会一直接受争论。我开始觉得人们是故意这么做的。@Valipour
HttpContext.Current
本身不是线程安全的。这是一个静态单态。此外,
会话
使用起来并不安全,因为它是一种按用户、按会话的存储机制,这样做可能会妨碍控制器对象在多个请求中得到正确处理。这是一个糟糕的答案。