2011-03-01 120 views
0

我已經分析出的URL創建了一個通用控制器工廠從數據庫中加載實體:如何加載多個控制器工廠並將控制權交給下一個控制器工廠?

entity/products/123456.htm 

不過,我想可以,如果沒有找到實體加載一個實際控制人,或者通過創建物理控制器而不是由URL模式創建的「虛擬」控制器來覆蓋缺省實體行爲(如果需要的話)。

眼下,的global.asax.cs我做:

ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory)); 

我如何,無論是在EntityControllerFactory,或global.asax.cs這裏,在控制傳遞給另一家工廠,在事件我是否像MVC的默認控制器/行動計劃接管?

回答

3

您可以創建一個複合IControllerFactory實現:

public class EntityControllerFactory : IControllerFactory { 
    private IControllerFactory defaultFactory = new DefaultControllerFactory(); 

    public IController CreateController(RequestContext requestContext, string controllerName) { 
     if(needsCustomLogic) { 
      // do your custom logic here and return appropriate result 
     } else { 
      return defaultFactory.CreateController(requestContext, controllerName); 
     } 
    } 

    // same for the other methods on IControllerFactory 
} 

這工作,因爲默認情況下的ControllerBuilder.Current.GetControllerFactory()的值是DefaultControllerFactory一個實例。

通過獲取默認實例並將其傳遞到您的工廠,您可能還會考慮使您的工廠更具前瞻性(以防MVC的新版本從GetControllerFactory開始返回不同類型;不太可能,但可能發生):

// in Global.asax 
var defaultFactory = ControllerBuilder.Current.GetControllerFactory(); 
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory));