Ninject + MVC3 = InvalidOperationException:Sequence不包含任何元素

Jud*_*ngo 89 ninject asp.net-mvc-3

我创建了一个新的MVC3项目,点击F5,看到了示例页面.

然后我使用NuGet获得Ninject.MVC扩展.我根据Ninject文档,如何设置MVC3应用程序修改了我的global.asax :

public class MvcApplication : NinjectHttpApplication
{
   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
   {
       filters.Add(new HandleErrorAttribute());
   }

   public static void RegisterRoutes(RouteCollection routes)
   {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", 
               id = UrlParameter.Optional });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在当我运行应用程序时,我得到了死亡的黄色屏幕,但有以下异常:

InvalidOperationException - Sequence不包含任何元素.

在System.Linq.Enumerable.Single(...)

在Ninject.Web.Mvc.Bootstrapper.Initialize(...)第67行.

当然,该文件的第67行调用.Single(),从而抛出异常.

我究竟做错了什么?

Che*_*hev 120

我必须补充一点,希望别人能够更快地解决问题而不想像我几乎那样把头发上的每一根头发拉出来.

我需要重命名项目中的所有内容以匹配新的业务术语.我在任何地方更改了名称空间,我甚至更改了程序集名称(右键单击项目>属性>应用程序选项卡),以便生成的程序集与新的命名约定匹配.组件重命名是让Ninject非常生气的原因!

通过重命名生成的程序集,我们在编译时创建了一个带有新名称的新文件.但是,旧文件的旧文件仍在bin目录中!如果您通过App_Start中添加的类激活Ninject,则将在BOTH程序集(旧的和新重命名的程序集)中调用此激活类.不要问我怎么或为什么,但确实如此,它会给你这个"已经初始化"的错误.

甚至清洁解决方案都不起作用,因为Visual Studio只会删除它正在生成的二进制文件,这将是新重命名的二进制文件.它只留下旧的那些只是坐在那里.

在尝试执行任何其他操作之前,请删除bin文件夹!我希望这可以节省其他人浪费宝贵的工作时间!

  • 好吧,在我偶然发现你的答案之前,我浪费了40分钟.谢谢Alex! (7认同)
  • 接受的答案没有为我做,但这个做了.谢谢Alex. (3认同)
  • 这太棒了.非常感谢.我完成了这个,一个完整的命名空间重命名,甚至没有将我的问题归因于程序集仍然在bin中构建的事实.非常感谢你! (3认同)
  • 非常感谢!我在这个问题上烧了一个小时,如果没有你的反应,我会烧掉更多.这应该是适当问题的正确答案. (2认同)
  • 辉煌!谢谢Alex.我浪费了太多时间试图找到底线,你的解决方案完美无缺. (2认同)

Dar*_*rov 101

您可能会注意到在安装ninject.mvc3NuGet 之后,在App_Start项目中创建了一个包含NinjectMVC3.cs文件的子文件夹.删除此文件夹,然后重试.以下是我遵循的步骤:

  1. 使用默认模板创建新的ASP.NET MVC 3项目
  2. 打开包管理器控制台窗口(查看 - >其他Windows - >包管理器控制台)
  3. install-package ninject.mvc3在命令行上键入
  4. Global.asax您问题中的代码替换默认代码
  5. 删除AppStart在安装程序包期间创建的子文件夹
  6. 运行该应用程序
  7. 享受/Home/Index在Google Chrome网络浏览器中打开的默认页面的美感:-)

  • 这不是一个bug.NuGet包只使用另一种方式来设置内核,这样就不必更改global.asax.您的应用程序同时使用两种方式,这使得扩展程序在启动两次时处于无效状态. (19认同)
  • @Kyralessa,保留Global.asax(不是来自`NinjectHttpApplication`)并在`〜/ App_Start/NinjectMVC3.cs`文件(`RegisterServices`方法)中配置内核. (12认同)
  • 如果没有*删除App_Start文件夹,解决此问题的正确方法是什么? (4认同)
  • 那很有效.我不知道为什么.我不喜欢在不了解错误的情况下修复bug ...但是谢谢,这让我感到安心. (3认同)

Rem*_*oor 23

我已经更新了您的问题中链接的文档Wiki,以显示设置MVC3应用程序的两种方法.我建议使用第二个选项,这是NuGetpackage的首选方式.

它不是从NinjectHttpApplication派生而是使用AppStart文件夹中的NinjectMVC.cs,它是在安装包时创建的.这也是您创建内核的位置以及加载模块的位置或定义绑定的位置.