Ninject.MVC5 не генерирует NinjectWebCommon.Cs

Я разрабатываю проект MVC5 в Visual Studio 2017 Version 15.4. Я получаю неожиданный результат здесь, с чем я никогда не сталкивался. Я установил пакет Ninject.MVC5 из nuget. Он прекрасно устанавливает и не дает никаких ошибок или предупреждений. Но проблема в том, что он не генерирует файл NinjectWebCommon.cs в папке App_Start. Есть ли причина?

Ответ 1

После многих поисков и тестов у меня есть точное решение, где я столкнулся с ошибкой, когда система пыталась создать несколько экземпляров одновременно с предыдущим ответом. Здесь мне нужно было создать класс NinjectWebCommon только без наследования 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()
        });
    }
}

Но вот проблема с параметризованным конструктором. Чтобы избежать этой проблемы, я добавил метод создания Конкретный экземпляр. Итак, вот обновленный код.

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

Ответ 2

Он выглядит как самый последний Ninject.Web.Common.WebHost 3.3.0. В пакет NuGet больше не входит NinjectWebCommon.cs. Старые версии, такие как 3.2.0, включают этот файл.

Ninject.Web.Common.WebHost 3.3.0 предоставляет класс NinjectHttpApplication, из которого вы можете извлечь и использовать вместо NinjectWebCommon.cs. Документация wiki для Ninject, похоже, не была обновлена, но похоже, что использование NinjectHttpApplication - это один документальный подход

см. комментарий к мату - Веб-интерфейс API2 NinjectWebCommon.cs не отображается

Ответ 3

Установите Ninject.MVC5 из пакета Nuget и сохраните версию 3.2.1. В последней версии 3.3.0 он не добавлял файл NinjectWebCommon.cs, поэтому я понизил версию, и она сработала для меня.

Удачного кодирования!

Ответ 4

Установите все нижеуказанные пакеты, он будет работать автоматически.

идентификатор пакета = версия Ninject = 3.3.4 targetFramework = идентификатор пакета net451 = версия Ninject.Extensions.Convention = 3.3.0 targetFramework = идентификатор пакета net451 = версия Ninject.Extensions.Factory = 3.3.2 targetFramework = идентификатор пакета net451 = идентификатор пакета Ninject.MVC5 версия = 3.3.0 targetFramework = идентификатор пакета net451 = код Ninject.Web.Commonenter здесь версия = 3.3.1 targetFramework = идентификатор пакета net451 = Ninject.Web.Common.W

Ответ 5

Я столкнулся с той же проблемой, для исправления которой я изменил версию пакетов Ninject на 3.2.2. (Downgrade). При этом будет сгенерирован файл NinjectWebCommon.cs. Но при запуске проекта это выдаст ошибку, поэтому снова переключитесь на более раннюю версию Ninject пакетов. И запустить проект. Проект будет работать правильно