自定义控制器工厂,ASP.NET MVC的依赖注入/结构图问题

时间:2009-04-05 20:55:13

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

我最近尝试使用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被调用两次。第一次调用时,传入一个合适的controllerType,但在第二次调用时它总是为空。

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

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

2 个答案:

答案 0 :(得分:45)

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

您可以使用结构图here查看详细说明以及设置依赖关系注入的示例。

我遇到了同样的问题,我想我已经明白了。无论出于何种原因,每当您尝试提供自己的控制器工厂时,都需要添加一些额外的IgnoreRoute定义。我要做的第一件事就是将这一行添加到你的GetControllerInstance方法中:

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

这至少会在错误消息中为您提供有关导致controllerType为null的请求的更多信息。在我的特定情况下,我在我的css文件集中有一个背景图像:

background: url(img/logo.gif);

所以会发生什么,路由正在寻找一个名为“img”的控制器,以及一个沿着这些线路采用logo.gif或其他东西的动作。这显然不是正确的行为。

经过一番挖掘后,我意识到我需要在我的Global.asax文件中添加一个IgnoreRoute定义,该文件会忽略我网站“content”目录中的任何内容,如下所示:

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

我仍然不确定为什么你不需要使用默认的ControllerFactory来做这个,但它仍然可以。

您可能会遇到与favicon.ico相同的问题。特别是如果你使用谷歌crhome。你还需要添加它:

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

答案 1 :(得分:4)

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