ASP.NET MVC 的自定義控制器工廠、依賴注入/結構圖問題
我最近嘗試使用 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(/.*)?"})