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

时间:2011-03-01 22:03:38

标签: asp.net-mvc-3 ninject

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

然后我用NuGet来获取Ninject.MVC extension。我根据Ninject文档How To Setup an MVC3 Application修改了我的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);
   }
}

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

  

InvalidOperationException - Sequence不包含任何元素。

     

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

     

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

果然,line 67 of that file调用.Single(),从而抛出异常。

我做错了什么?

7 个答案:

答案 0 :(得分:120)

我必须补充一点,希望别人能够更快地解决这个问题,而不是像我差不多那样把头发拉到头上。

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

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

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

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

答案 1 :(得分:101)

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

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

答案 2 :(得分:23)

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

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

答案 3 :(得分:4)

正如Alex Ford所说:

  

我必须补充一点,希望别人能解决这个问题   发出更快,不想拔掉每一根头发   他们的头像我几乎一样。

我有一个特殊版本的问题可以解决如下:

  

异常详细信息:System.InvalidOperationException:Sequence不包含任何元素

     

这个错误是由于有2个项目所带来的   App_Start / NinjectWebCommon.cs

     

删除文件可以消除错误。

     

注意:如果你需要,那么你正在努力获得Ninject.Web.Common   为您的一个类库引用Ninject.Web.Common程序集   项目,您可以安全地删除“App_Start”文件夹和   “NinjectWebCommon.cs”。它适用于web / web api项目。

     

>click here to view the original blog entry<

答案 4 :(得分:2)

我的解决方案是我已将App_Start文件夹属性Namespace Provider设置为True。

我已将此更改为False,以便Resharper不会突出显示与文件夹结构不匹配的命名空间。

答案 5 :(得分:2)

想再增加一个原因...

我们将Ninject.MVC3软件包安装到多个项目中 - 其中只有一个是实际的MVC应用程序。但是,我们忘记删除App_Start文件夹。

从引用的项目中删除App_Start文件夹解决了这个问题。

答案 6 :(得分:1)

为了解决@ Chev的回答......这也是我的终极问题。如果您要部署到Azure网站(现在名为AppSite),则要在发布中单击此框以删除旧文件

publish to azure screenshot