2013-04-04 53 views
3

在項目中,我在這樣如何在另一個類中獲取當前控制器實例?

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方法怎麼能我從電流控制器獲得的實例並調用它

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

你爲什麼試圖使用控制器作爲類對象 – Satpal 2013-04-04 07:49:28

+0

@SatpalSingh我想在我的異常管理類中調用SetNotification方法 – 2013-04-04 07:52:12

+1

你的控制器不應該有這樣的邏輯。你正在發現[洋蔥建築](http://jeffreypalermo.com/blog/the-onion-architecture-part-1/),並且應該研究什麼是服務層,以及它應該如何用於[保持你的控制器很薄](http://www.codemag.com/article/1405071)。 – 2016-11-28 12:55:35

回答

4

˚F從這個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,並呼籲有

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); 
    } 
} 
+2

爲什麼人們倒下了?至少要小心解釋,我會一直接受爭論。我開始覺得人們故意這樣做。 – 2013-04-04 11:02:51

+0

這對於多線程有多安全? – 2014-08-06 08:31:16

+1

@Valipour'HttpContext.Current'本身不是線程安全的。這是一個靜態的單身人士。此外,'會話'是不安全的,因爲它是一個每用戶,每會話的存儲機制,並且做這樣的事情可能會阻止你的控制器對象在許多請求中正確處理。這是一個不好的答案。 – 2016-11-28 12:47:54

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

其更好地投入去HttpCont ext.Items insted Session

相關問題