【问题标题】:Custom Controller Factory, Dependency Injection / Structuremap problems with ASP.NET MVCASP.NET MVC 的自定义控制器工厂、依赖注入/结构图问题
【发布时间】:2009-04-05 20:55:13
【问题描述】:

我最近尝试使用 StructureMap 实现依赖注入。我设法一直遵循该示例,但每次尝试运行应用程序时都会遇到抛出的异常。这是我的控制器工厂的一些代码 sn-ps。

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 被调用了两次。第一次调用时,传入了正确的 controllerType,但第二次调用时它始终为 null。

第一次调用 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());
    }

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

【问题讨论】:

  • 老兄,我遇到了完全相同的问题。
  • 如何注册控制器?
  • 我认为你应该抛出一个404 http exception

标签: asp.net-mvc dependency-injection structuremap


【解决方案1】:

更新 发生这种情况的原因是,当在 css 文件中指定图像并且该图像丢失时,路由框架会尝试将 url 映射到控制器。忽略下面列出的路由将防止错误发生,但我决定不实施它,因为这是通知您缺少资源的好方法。

您可以查看详细说明以及使用 Structure Map here 设置依赖注入的示例。

我遇到了同样的问题,我想我已经解决了。无论出于何种原因,每当您尝试提供自己的控制器工厂时,您都需要添加几个额外的 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(/.*)?"})

【讨论】:

  • 谢谢,大概是这个原因,等我在家回来汇报
  • 我在使用 Windsor ControllerFactory 时遇到了同样的问题。感谢您的修复,效果很好。
  • + 1 表示背景:url(img/logo.gif);我的错误是我使用的是 JQuery UI 并且没有包含图像文件。我只使用了一小部分功能,并没有意识到我需要的图像 - 哎呀!
  • 这正是我的问题。感谢您的详细回复:-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多