27

我最近尝试使用 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());
    }

我非常渴望让依赖注入工作,如果有人能帮助我,我将不胜感激。:)

4

2 回答 2

45

更新 发生这种情况的原因是,当在 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(/.*)?"})
于 2009-04-06T12:56:44.897 回答
4

我猜您正在请求一个静态文件,例如一个 javascript 文件,该文件尚未添加到您的项目中,或者对它的引用可能有错字。您应该监控您的浏览器 Web 请求,并在它们应该正确解析为静态文件时查找那些没有正确解析为静态文件的 Web 请求。如果您使用 IE 来执行此操作,则可以在 FF 或 fiddler 中使用 firebug。

于 2009-04-06T04:01:38.347 回答