Ninject MVC3 - 引导程序抛出“已经初始化”的异常

时间:2011-05-06 10:57:51

标签: c# .net asp.net-mvc-3 ninject

我创建了一个空的Asp.Net MVC3项目,并使用了nuget install-package Ninject.MVC3

没有做任何其他事情(没有注册服务,甚至没有创建控制器)我运行应用程序。

项目在NinjectMVC3.cs的第22行中断,但有以下异常:

  

[InvalidOperationException:已经初始化!]      Ninject.Web.Mvc.Bootstrapper.Initialize(Func`1 createKernelCallback)位于c:\ Projects \ Ninject \ Maintenance2.2 \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ Bootstrapper.cs> :58      Mvc.App_Start.NinjectMVC3.Start()在c:\ Projects \ Events \ Events \ App_Start \ NinjectMVC3.cs:22

     

[TargetInvocationException:Exception   被一个人的目标抛出了   调用]
  System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo   方法,对象目标,对象[]   参数,SignatureStruct& SIG,   MethodAttributes methodAttributes,   RuntimeType typeOwner)+0
  System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo   方法,对象目标,对象[]   参数,签名信号,   MethodAttributes methodAttributes,   RuntimeType typeOwner)+72
  System.Reflection.RuntimeMethodInfo.Invoke(对象   obj,BindingFlags invokeAttr,Binder   binder,Object []参数,   CultureInfo文化,布尔   skipVisibilityChecks)+335
  System.Reflection.RuntimeMethodInfo.Invoke(对象   obj,BindingFlags invokeAttr,Binder   binder,Object []参数,   文化信息文化)+28
  System.Reflection.MethodBase.Invoke(对象   obj,Object []参数)+19
  WebActivator.BaseActivationMethodAttribute.InvokeMethod()   +199 WebActivator.ActivationManager.RunActivationMethods()   +330 WebActivator.ActivationManager.RunPreStartMethods()   +27 WebActivator.ActivationManager.Run()   39

NinjectMVC3.cs中的行是:

public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
            DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
            bootstrapper.Initialize(CreateKernel); // <- this one right here...
        }

这是怎么回事?我已经在其他项目中使用Ninject for MVC3而没有任何问题。我注意到Start()方法中的第二行没有包含在Ninject.MVC3的旧(周)包中,所以在最近的更新中可能还有其他内容被破坏了吗?

请帮忙!

编辑以解决来自Remo的回答

这是来自我的global.asax.cs

 public class MvcApplication : System.Web.HttpApplication
 {

global.asax也是100%的标准。没有做任何调整。

编辑 - 问题已经消失......

老实说,我不知道是什么导致了这种情况,但是在重新启动Visual Studio并完全重启之后,该项目正在按原样运行。我也不能在新项目中重新创建问题。

抱歉浪费你的时间:)

15 个答案:

答案 0 :(得分:33)

查看Setting up a MVC3-application

简而言之:

您的项目中可能包含App_Start个文件夹NinjectMVC3.cs

将NuGet包与修改Global.asax(没有理由)一起使用时,必须删除App_Start文件夹并删除对WebActivator和Microsoft.Web.Infrastructure的引用

答案 1 :(得分:15)

当我更改项目的命名空间,然后再将其切换回来时,这种情况出现了。

即使我清理了解决方案并执行了iisreset,它也会以“已经初始化”的方式返回。

问题产生于我更改命名空间并构建项目时在bin目录中创建的dll - 在更改命名空间并清理解决方案后,替代命名空间中的dll仍然存在,因此正在在Web应用程序启动时加载,导致“已初始化”错误。

删除dll解决了问题。

答案 2 :(得分:12)

您很可能是从NinjectHttpApplication派生并同时使用AppStart。这两种方式不应混淆。

阅读文档https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application

答案 3 :(得分:4)

我最近遇到了同样的问题。就我而言,我的解决方案中有多个项目...而且其中一个项目包含对Ninject.MVC3的NuGet包引用。

当我更新了所有Ninject包版本时,在所有具有NuGet引用的项目上创建了App_Start文件夹。所以,我不得不从类库项目中删除App_Start文件夹;只需将App_Start文件夹留在主MVC应用程序上。

答案 4 :(得分:3)

问题消失了......

老实说,我不知道是什么导致了这种情况,但是在重新启动Visual Studio并完全重启之后,该项目正在按原样运行。我也不能在新项目中重新创建问题。

抱歉浪费你的时间:)

<强>更新

自从发布此答案后,出现了一些好的答案。我正在更新这个答案,以便在一个答案中收集不同的方法。希望对你们好:

  

DevilDog74已回答

     

最后我去了gitub并克隆了一个   新的回购,下载了最新的   Ninject.Web.Common和最新的Ninject2   发布版本并进行本地发布   建立。   然后我抛弃了nuget包并对新编译的&gt;进行了汇编引用。程序集“Ninject”,“Ninject.Web.Common”和“Ninject.Web.Mvc”和我的项目开始&gt;正在创建工作和控制器,其依赖关系正在解决。

     

Jeff Circeo已回答

     

我通过下载解决了这个问题   从   https://github.com/ninject/ninject.web.mvc   而不是使用nuget包。一世   在我之后没有做任何事情   添加了参考文献。

     

Marcus King已回答

     

最终为我工作的是   删除Ninject MVC NuGet包   完全只需添加Ninject   和Ninject dll是老式的   办法。我想可能有些东西   他们的NuGet包错了。

答案 5 :(得分:3)

我不确定是什么导致你的应用程序炸弹,但我很高兴做VS重启解决了它。我发生了同样的错误,但无论我做了多少次清理/重建或重启VS多少次都无法纠正。

最终为我工作的是完全删除Ninject MVC NuGet包,只是添加Ninject和Ninject dll的老式方法。我认为他们的NuGet包可能有问题。

我希望这可以帮助别人,当我需要的只是转储NuGet包时,我浪费了几个小时。

答案 6 :(得分:2)

阅读文档!

https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application

这些方法之间有什么区别?

两种方法完全相同。他们将Ninject挂钩到MVC应用程序中。唯一的区别是他们使用不同的approch来做到这一点。使用不同approchaches的原因是NuGet包可以通过添加一个文件提供开箱即用的集成。否则,需要对global.asax进行复杂的修改

注意:如果您决定使用第一种方法,如果使用NuGet包(没有理由),则必须删除App_Start文件夹并删除对WebActivator和Microsoft.Web.Infrastructure的引用。

答案 7 :(得分:2)

当我将Ninject.Web.MVC3软件包升级到2.2.2.0版时,我遇到了同样的问题。我注意到此更新将以下行添加到我的.csproj文件(VCS FTW!):

<Compile Include="App_Start\NinjectMVC3.cs" />

将编译操作从编译更改为该文件的内容解决了我的问题。毕竟,App_Start和App_Code一样邪恶......

答案 8 :(得分:2)

我通过手动删除/ bin文件夹中的一些dll解决了这个问题,当从Visual Studio运行清理命令时,这些dll没有被删除。

答案 9 :(得分:1)

我遇到了同样的问题,我从NinjectHttpApplication继承并覆盖了OnApplicationStarted。 我通过从https://github.com/ninject/ninject.web.mvc下载而不是使用nuget包来解决此问题。

添加引用后我没有做任何事情。

答案 10 :(得分:1)

我花了大约4个小时搞乱了nuget套餐,但没有用。

最后我去了gitub并克隆了一个新的repo,下载了最新的Ninject.Web.Common和最新的Ninject2发布版本并进行了本地发布版本。

然后我抛弃了nuget包并对新编译的程序集“Ninject”,“Ninject.Web.Common”和“Ninject.Web.Mvc”进行了程序集引用,我的项目开始工作,并且正在使用它们的依赖项创建控制器正在解决。

这是我的代码看起来像,但我认为nuget包中可能还有一个问题......

public class MvcApplication : NinjectHttpApplication
{
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override Ninject.IKernel CreateKernel()
    {
        // declaratively add the Ninject Modules that we have built to manage our dependencies...
        var modules = new INinjectModule[]{
            new RepoModule()
        };

        return new StandardKernel(modules);
    }

    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 } // Parameter defaults
        );

    }
}

答案 11 :(得分:1)

确保只有一个程序集具有“NinjectMVC3”类,如果a.dll,b.dll都在bin目录中都有NinjectMVC3类,那就会出现这样的错误!

答案 12 :(得分:1)

我刚才遇到了同样的问题,我意识到这是因为NuGet将NinjectMVC3.cs文件添加到我的网络应用程序和我的DAL库中。没有意识到发生了这种情况,但是一旦我从DAL库中删除了文件就没问题了。

答案 13 :(得分:0)

当您使用nuGet时,会创建一个App_start文件夹,请查看它。

答案 14 :(得分:0)

我会将此作为答案添加,因为我还没有看到任何人提及它,并且在离开之前进行检查并克隆回购和其他什么。

我在一个包含大约15个项目的解决方案中突然遇到了这个问题,其中三个是网站。当我开始遇到这个问题时,我一直在其中一个网站上工作,而我没有改变任何显然会导致问题的东西:我没有在任何地方添加Ninject(它已经安装并且工作得很好),全局的asax文件是不是从Ninject类派生的,任何App_Start文件夹都没有任何问题。

经过一段时间的讨论与NuGet等无关(由未解决的引用的消息引起 - 似乎Ninject没有被正确引用,但它是),我查看了我已经更改支付的所有文件特别注意项目和配置文件,并发现Visual Studio已经将某个其他网站添加为我试图运行的项目引用。结果Ninject配置被运行两次导致问题,所以根本原因是相同的,但是搞砸的方法是不同的。

该项目引用没有理由,因为它不是一个有效的依赖项,它之前不存在,我没有手动添加它,我仍然不知道它是如何发生的,但立即删除它修复了问题。 / p>