我最近尝试使用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,但在第二次调用时它始终为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()); }
我非常渴望让依赖注入工作,如果有人能帮助我,我会非常感激.:)
更新 发生这种情况的原因是,当在css文件中指定图像并且该图像丢失时,路由框架会尝试将URL映射到控制器.忽略下面列出的路由可以防止错误发生,但我决定不实现它,因为这是一个通知您缺少资源的好方法.
您可以在此处查看详细说明以及使用Structure Map设置依赖项注入的示例.
我遇到了同样的问题,我想我已经明白了.无论出于何种原因,每当您尝试提供自己的控制器工厂时,都需要添加一些额外的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(/.*)?"})