我最近尝试使用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());
}
我非常渴望让依赖注入工作,如果有人能帮助我,我会非常感激。 :)
答案 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。