2009-09-01 65 views
10

我有一个使用StructureMap进行依赖注入的项目。该项目编译好一个MVC项目,但一切都移动到MVC2项目后,我现在收到以下错误:ASP.NET MVC 2预览1 - 问题编译StructureMap控制器工厂

Test.Web.Controllers.StructureMapControllerFactory.GetControllerInstance(System.Type)': no suitable method found to override C:\Test\Web\Controllers\StructureMapControllerFactory.cs 11 40 Test.Web

这里是我的StructureMapControllerFactory:

using System; 
using System.Web.Mvc; 
using StructureMap; 

namespace Test.Web.Controllers 
{ 
    public class StructureMapControllerFactory : DefaultControllerFactory 
    { 

     protected override IController GetControllerInstance(Type controllerType)** 
     { 

      IController result = null; 
      try 
      { 
       if (controllerType == null) return base.GetControllerInstance(controllerType); 
       result = ObjectFactory.GetInstance(controllerType) as Controller; 

      } 
      catch (StructureMapException) 
      { 
       System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
       throw; 
      } 

      return result; 
     } 

    } 
} 

我已经找到了一个半后有关这个问题,但它没有提供任何有关如何解决我的问题的见解:MVC 2 preview 1 - methods with parameters in the controller fail to load

显然我必须错过1.0-2.0进展的变化,但我不知道是什么改变了。任何帮助总是感激。

回答

19

此方法的签名已更改。现在有RequestContext的的第一个参数:

protected override IController GetControllerInstance(
    RequestContext requestContext, 
    Type controllerType) 

您还需要您的来电改为base.GetControllerInstance:

if (controllerType == null) 
    return base.GetControllerInstance(requestContext, controllerType); 
+0

非常感谢Craig。我想知道为什么在探索System.Web.MVC [2.0.0.0]名称空间时,VS对象浏览器中没有反映出这一点。 – 2009-09-01 20:31:37

+1

不确定,但您可以在代码编辑器中键入ov [空格键](即开始键入“覆盖”,您通常会在其中声明新方法的位置),以获取当前类的可重载方法列表及其签名。 – 2009-09-01 20:39:10

1

我与反射追查,果然函数签名是改变。 的

保护内部虚拟一个IController GetControllerInstance(RequestContext的RequestContext的,类型controllerType)

的MVC 2的dll所在的位置: C:\ Program Files文件\微软ASP.NET \ ASP.NET MVC 2个\组件\ System.Web.Mvc.dll

谢谢,它解决了我的问题!

8

Craig Stuntz在这里非常正确。

只要确保你不要忘记引用System.Web.Routing另外如果你的DI是在一个不同的项目比你MVC的应用程序。

由于某些原因,在IDE中没有显示错误,但在编译时我仍然会得到一个GetControllerInstance“找不到合适的方法来覆盖”。

一旦我纠正缺少System.Web.Routing的引用程序集,一切都很好...

+0

谢谢!我不知道为什么,但添加一个对System.Web.Routing的引用为我解决了这个问题! – 2010-08-29 16:18:56

+0

感谢您的System.Web.Routing评论 - 为我节省了时间调试。 – Ben 2010-11-24 12:38:08