Asp.net-Mvc

ASP.NET MVC 的自定義控制器工廠、依賴注入/結構圖問題

  • April 5, 2009

我最近嘗試使用 StructureMap 實現依賴注入。我設法一直遵循該範例,但每次嘗試執行應用程序時都會遇到拋出的異常。這是我的控制器工廠的一些程式碼片段。

public class StructureMapControllerFactory : DefaultControllerFactory
{
   protected override IController GetControllerInstance(Type controllerType)
   {
       if (controllerType == null)
           throw new ArgumentNullException("controllerType");

       return ObjectFactory.GetInstance(controllerType) as Controller;
   }
}

我的 Global.asax 呼叫了一個靜態 BootStrapper 類,該類註冊了我的所有依賴項,但看起來 StructureMapControllerFactory 的 GetControllerInstance 被呼叫了兩次。第一次呼叫時,傳入了一個正確的控制器類型,但在第二次呼叫時它始終為空。

第一次呼叫 GetControllerInstance 時,類型設置為 HomeController 是正確的。HomeController 中觸發的程式碼並返回 View()。在 View() 返回時,在 aspx 文件上呼叫 Page_Load 事件。完成之後,它到達了一行:

httpHandler.ProcessRequest(HttpContext.Current);

這就是第二次呼叫 GetControllerInstance 的地方。

這是我可能相關的 Global.asax 位:

  protected void Application_Start()
   {
       RegisterRoutes(RouteTable.Routes);

       Bootstrapper.ConfigureStructureMap();

       ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
   }

我非常渴望讓依賴注入工作,如果有人能幫助我,我將不勝感激。:)

更新 發生這種情況的原因是,當在 css 文件中指定圖像並且該圖像失去時,路由框架會嘗試將 url 映射到控制器。忽略下面列出的路線將防止錯誤發生,但我決定不實施它,因為這是通知您缺少資源的好方法。

您可以在此處查看詳細說明以及使用結構映射設置依賴注入的範例。

我遇到了同樣的問題,我想我想通了。無論出於何種原因,每當您嘗試提供自己的控制器工廠時,您都需要添加幾個額外的 IgnoreRoute 定義。我要做的第一件事就是將此行添加到您的 GetControllerInstance 方法中:

if(controllerType == null)
   return base.GetControllerInstance(controllerType)

這至少會在錯誤消息中為您提供有關導致 controllerType 為空的請求的更多資訊。在我的特殊情況下,我的 css 文件中有一個背景圖像,如下所示:

background: url(img/logo.gif);

所以發生的事情是路由正在尋找一個名為“img”的控制器和一個採用 logo.gif 或類似內容的操作。這顯然不是正確的行為。

經過一番探勘,我意識到我需要在我的 Global.asax 文件中添加一個 IgnoreRoute 定義,它會忽略我網站的“內容”目錄中的任何內容,如下所示:

routes.IgnoreRoute("{Content}/{*pathInfo}");

我仍然不確定為什麼您不需要使用預設的 ControllerFactory 來執行此操作,但它仍然可以工作。

您可能會遇到與 favicon.ico 相同的問題。特別是如果您使用 google crhome。您還需要添加以下內容:

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"})

引用自:https://stackoverflow.com/questions/719678