2011-02-15 14 views
1

工作之後,似乎是針對MVC 3.0和Castle.Windsor我碰到一個有點障礙的樣本 - 我知道一個解決辦法,但我真搞不清楚什麼現在要做的'最佳實踐'。城堡的ControllerFactory樣品不與MVC地區

http://stw.castleproject.org/(S(su2mgm45fclhqe55veo40545))/Windsor.MainPage.ashx

在本例中,作者構成一個WindsorControllerFactory。 [http://stw.castleproject.org/(S(su2mgm45fclhqe55veo40545))/Windsor.Windsor-tutorial-part-two-plugging-Windsor-in.ashx]

這裏是他使用的代碼...

public class WindsorControllerFactory: DefaultControllerFactory 
{ 
    private readonly IKernel kernel; 

    public WindsorControllerFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     kernel.ReleaseComponent(controller); 
    } 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var controllerComponentName = controllerName + "Controller"; 
     return kernel.Resolve<IController>(controllerComponentName); 
    } 
} 

現在,這樣沒有問題......之類的。這個問題是與任何ASP.NET MVC應用程序,具有地區參與。 controllerName在那裏不起作用。

在其他的ControllerFactory實現我所看到的,人們使用overrided方法GetControllerInstance在這樣的時尚...

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
      throw new HttpException(404, string.Format("The controller for path '{0}' could not be found or it does not implement IController.", requestContext.HttpContext.Request.Path)); 

     return (IController)_container.Resolve(controllerType); 
    } 

所以我很困惑。什麼被認爲是最好的方法? CreateControllerGetControllerInstance

在任何人提出MVCContrib之前 - 我已經探究過它,並且要坦率地說,我必須要麼是荒謬的愚蠢,要麼就是錯過了一點,因爲我甚至找不到ControllerFactory - 並且在我爲它下載的二進制文件,我無法獲得任何連接。我明白這個項目是一個非常好的項目,不是抨擊它 - 但是我看到它很多,並且我找不到人們在說什麼。

誰能幫我清理這個謎?爲什麼本教程的作者向我們展示了一個不適用於區域的ControllerFactory?怎麼能和他們一起工作?爲什麼有些使用CreateController和一些使用GetControllerInstance?任何信息都被過度讚賞。

+0

IoC的整合從MvcContrib去除ASP.NET MVC 3 – 2011-02-15 15:27:30

回答

1

其實你是對的。在引入區域之前1天,MVC中的現有實現就OK了。目前應該重寫GetControllerInstance方法以適應這種情況。隨時修復它並提交拉取請求。