2012-04-25 81 views
24

我创建了一个新的MVC Web应用程序,并且引用了Ninject.dll,Ninject.Web.Common.dll和Ninject.Web.MVC.dll。如何在ASP.NET MVC Web应用程序中使用Ninject?

的Global.asax.cs:

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); 
     } 
    } 

App_start \ NinjectWebCommon:

public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
     }   
    } 

我得到错误 “的序列不包含任何元素”。我究竟做错了什么?

错误的详细信息:

Description: An unhandled exception occurred during the execution of the current web request. Examine the stack trace for more information about this error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Sequence contains no elements 

Source Error: 
    Unhandled exception occurred during execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 


Stack Trace: 

[InvalidOperationException: Последовательность не содержит элементов] 
    System.Linq.Enumerable.Single(IEnumerable`1 source) +320 
    Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53 
    Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52 
    Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32 
    Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52 
    Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:80 
+0

您可以添加完整的堆栈跟踪? – 2012-04-25 10:12:25

+0

更新我的帖子 – Mediator 2012-04-25 10:32:19

+0

[Line 53](https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/N injectMvcHttpApplicationPlugin.cs#L53)似乎试图从MVC中删除[DataAnnotationsModelValidatorProvider](http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.aspx)。你使用的是MVC的正确版本/你是否以某种方式自己配置了它? – Rup 2012-04-25 10:38:00

回答

24

您从NinjectHttpApplication派生并您在同一时间使用App_Start。选一个!阅读docu of Ninject.MVC3了解更多信息。

+0

啊,整洁 - 所以他看到关于删除DataAnnotationsModelValidatorProvider的错误的原因是他第二次初始化Ninject,并且第一个init已经删除它?我想这是一个有用的方法,但它可能会失败得更加优雅 – Rup 2012-04-25 13:55:31

+5

@Remo Gloor - 我不得不说这两种不同的方法对于初学者甚至是文档都是令人难以置信的混淆。这些文档的确基本上说'它们完全一样',但看着代码,Nuget方法有一个空的'RegisterServices'方法,而NinjectHttpApplication方法有'kernal.Load(Assembly.GetExecutingAssemby)'。这些都不一样,并且对该页面文档的更多指导将非常感谢。这是人们可能在Ninject上找到的第一批页面之一,对于初学者来说,更多的细节将会很棒 – 2012-12-14 08:45:13

+0

@Simon_Weaver使用NinjectHttpApplication方法添加了RegisterServices方法,以实现注册码的相同实现。现在它真的是一样的。如果您需要更多信息,请添加TODO的意见,或者如果您知道答案,请自行添加。 – 2012-12-17 07:59:23

39

为了这个明确清楚,如果你用的NuGet加入“Ninject.Mvc3”包(我使用的版本3.0.0.6),有无需做任何修改global.asax.cs。 NuGet包通过在您的MVC 4项目的App_Start文件夹中创建NinjectWebCommon类来帮助您。

我这样说是因为我似乎跟着原版海报的类似教程(我跟着一篇名为'Dependency Injection in asp.net mvc4 and webapi using Ninject'的代码项目的文章),并且与原始海报有完全相同的问题。该代码项目文章没有说清楚,你应该要么使用的NuGet(不要碰global.asax.cs手动添加Ninject引用(和修正global.asax.cs)。

7

确保你没有引用项目,该项目还采用了NinjectMVC3 App_Start。 删除该引用这些后,我的项目开始工作。此外,正如之前所说,检查命名空间的所有比赛,并都是正确的。

+0

这是我确切的问题。感谢提示! – code5 2014-05-10 23:18:06

相关问题