web-dev-qa-db-fra.com

Comment puis-je travailler avec Ninject dans une application Web ASP.NET MVC?

J'ai créé une nouvelle application Web MVC et j'ai des références à Ninject.dll, Ninject.Web.Common.dll et Ninject.Web.MVC.dll.

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

J'obtiens l'erreur "La séquence ne contient aucun élément". Qu'est-ce que je fais mal?

Détails de l'erreur:

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
26
Mediator

Vous dérivez de NinjectHttpApplication ET vous utilisez App_Start en même temps. Choisissez-en un! Lisez le docu de Ninject.MVC pour plus d'informations.

24
Remo Gloor

Pour être clair à ce sujet, si vous utilisez NuGet pour ajouter le package 'Ninject.Mvc3' (j'ai utilisé la version 3.0.0.6), il n'y a pas besoin de faire de modifications à global.asax.cs. Le package NuGet fait la magie pour vous en créant la classe NinjectWebCommon dans le App_Start dossier de votre projet MVC 4.

Je dis cela parce que je semble avoir suivi un tutoriel similaire à l'affiche originale (j'ai suivi un article sur The Code Project appelé ' Dependency Injection in asp.net mvc4 and webapi using Ninject' ), et avait exactement le même numéro que l'affiche originale. L'article Code Project ne précise pas que vous devez soit utiliser NuGet (et ne pas toucher global.asax.cs ou ajoutez manuellement les références Ninject (et modifiez global.asax.cs).

40
Duncan Awerbuck

Assurez-vous de ne pas référencer un projet qui utilise également le NinjectMVC3 App_Start. Après avoir supprimé la référence à un tel, mon projet a commencé à fonctionner. En outre, comme indiqué précédemment, vérifiez que les espaces de noms correspondent tous et sont corrects.

7
dwbrito