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