2012-01-21 63 views
2

我已經實現了一個自定義路由(從RouteBase繼承),以便根據存儲在數據庫中的數據實現動態路由。處理之後,該路徑最終含有 1返回的RouteData)一種EF實體 2)動作 3)控制器每個路由的控制器工廠

所有作品如預期所不同的是,我想用於控制器值是任一的一個完整的類型名控制器(我允許我的用戶從管理面板中選擇它)或單詞「自動」。如果選擇「自動」,則使用結構圖查找實現通用控制器的控制器,該控制器爲<TEntityType>。爲此,我使用路由數據返回一個MvcRouteHandler,並將自定義控制器工廠傳遞給它的構造函數。

經過一點挖掘,我意識到MvcRouteHandler不會將該控制器工廠傳遞給它創建的MvcHandler,因此我的自定義控制器工廠從不會被調用,並且路由總是失敗。 我不確定我有什麼替代品,如果有的話。我想我大概可以設置控制器工廠,但我覺得這是錯誤的,因爲只有我的自定義路由處理的請求應該有自定義控制器工廠。

由於提前, 約翰

回答

1

在結束了以下工作。唯一的灰點是框架未傳遞RequestContext的ReleaseController方法。這是可以的,因爲所有的方法都是在控制器上調用dispose,如果它實現了IDisposible,所以默認的實現是好的。

public class RouteControllerFactory : IControllerFactory 
{ 
    private readonly DefaultControllerFactory Default = new DefaultControllerFactory(); 

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).CreateController(requestContext, controllerName); 
    } 

    public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).GetControllerSessionBehavior(requestContext, controllerName); 
    } 

    public void ReleaseController(IController controller) 
    { 
     Default.ReleaseController(controller); 
    } 
} 

要註冊控制器工廠只是使用 ControllerBuilder.Current.SetControllerFactory(typeof運算(RouteControllerFactory));

at Application_Start