web-dev-qa-db-fra.com

Ninject.MVC5 ne générant pas NinjectWebCommon.Cs

Je développe un projet MVC5 sur Visual Studio 2017 version 15.4. J'obtiens un résultat inattendu ici, ce que je n'avais jamais affronté auparavant. J'ai installé le paquet Ninject.MVC5 à partir de nuget. L'installation est bien et ne donne aucune erreur ou avertissement. Mais le problème est que cela ne génère pas de fichier NinjectWebCommon.cs dans le dossier App_Start. Y a-t-il une raison?

16
Jaber Kibria

Après beaucoup de recherches et de tests, j'ai la solution exacte: je faisais face à une erreur alors que le système essayait de créer plusieurs instances à la fois avec la réponse précédente. Ici, je devais créer NinjectWebCommon classe seulement sans hériter NinjectHttpApplication

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>
    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        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)
    {
        kernel.Load(new INinjectModule[]
        {
            new Module()
        });
    }
}

Mais voici un problème avec le constructeur paramétré. Pour éviter ce problème, j'ai ajouté une méthode pour créer Instance concrète . Alors voici le code mis à jour ..

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>
    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        return Container;
    }

    public static T GetConcreteInstance<T>()
    {
        object instance = Container.TryGet<T>();
        if (instance != null)
            return (T)instance;
        throw new InvalidOperationException(string.Format("Unable to create an instance of {0}", typeof(T).FullName));
    }

    public static IKernel _container;
    private static IKernel Container
    {
        get
        {
            if (_container == null)
            {
                _container = new StandardKernel();
                _container.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                _container.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(_container);
            }
            return _container;
        }
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Load(new INinjectModule[]
        {
            new Module()
        });
    }
}
5
Jaber Kibria

Il semble que le package Ninject.Web.Common.WebHost 3.3.0 le plus récent de NuGet n'inclut plus le fichier NinjectWebCommon.cs. Les versions plus anciennes, telles que 3.2.0, incluent ce fichier.

Ninject.Web.Common.WebHost 3.3.0 fournit une classe NinjectHttpApplication à partir de laquelle vous pouvez dériver et utiliser à la place de NinjectWebCommon.cs. La documentation du wiki pour Ninject ne semble pas avoir été mise à jour, mais il semble que l'utilisation de NinjectHttpApplication est une approche documentée. 

voir le commentaire de mat - Web API2 NinjectWebCommon.cs n'apparaissent pas

15
Joe

Installez tous les paquets ci-dessous, cela fonctionnera automatiquement.

package id = version du projet = 3.3.4 targetFramework = net451 package id = Ninject.Extensions.Conventions version = 3.3.0 targetFramework = net451 ID du package = Ninject.Extensions.Factory version = 3.3.2 targetFramework = net451 ID du package = Ninject.MVC5 version = 3.3.0 targetFramework = ID de package net451 = Code Ninject.Web.Commonenter ici version = 3.3.1 targetFramework = ID de package net451 = Ninject.Web.Common.W

2
Ravi Indra

Installez Ninject.MVC5 à partir du paquet Nuget et conservez la version 3.2.1Dans la dernière version 3.3.0, il n’ajoutait pas le fichier NinjectWebCommon.cs.

Bon codage!

0
Vinayak Savale