我正在Visual Studio 2017版本15.4上开发MVC5项目。我在这里得到了意想不到的结果,这是我以前从未遇到过的。我已经从Ninject.MVC5
安装了nuget
个软件包。它安装得很好,没有任何错误或警告。但问题是它没有在NinjectWebCommon.cs
文件夹中生成App_Start
文件。有什么理由吗?
答案 0 :(得分:16)
看起来最新的Ninject.Web.Common.WebHost 3.3.0 NuGet包不再包含NinjectWebCommon.cs。旧版本(例如3.2.0)包含此文件。
Ninject.Web.Common.WebHost 3.3.0提供了一个NinjectHttpApplication类,您可以使用它来代替NinjectWebCommon.cs。 Ninject的wiki文档似乎没有更新,但看起来使用NinjectHttpApplication是一种记录的方法
请参阅mat的评论 - Web API2 NinjectWebCommon.cs do not appear
答案 1 :(得分:5)
经过大量的搜索和测试,我得到了确切的解决方案,当系统尝试使用之前的答案一次创建多个实例时,我遇到了错误。在这里,我需要仅创建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 :(得分:3)
从Nuget软件包安装Ninject.MVC5并保留版本3.2.1 在最新的3.3.0版本中,它没有添加NinjectWebCommon.cs文件,因此我降级了版本,它对我有用。
快乐编码!
答案 3 :(得分:2)
安装以下所有软件包,它将自动运行。
包id = Ninject版本= 3.3.4 targetFramework = net451包id = Ninject.Extensions.Conventions版本= 3.3.0 targetFramework = net451包id = Ninject.Extensions.Factory版本= 3.3.2 targetFramework = net451包id = Ninject.MVC5版本= 3.3.0 targetFramework = net451包ID = Ninject.Web.Commonenter代码在这里版本3.3.1 = = targetFramework net451包ID = Ninject.Web.Common.W
答案 4 :(得分:0)
我遇到了同样的问题,为了解决此问题,我将Ninject软件包的版本更改为3.2.2(降级)。通过这样做,将生成NinjectWebCommon.cs。但是在运行项目时会出现错误,因此请再次切换到早期版本的Ninject软件包。 并运行该项目。该项目将正常运行
答案 5 :(得分:0)
并且您在App_Start文件夹中拥有NinjectWebCommon.cs
答案 6 :(得分:0)
Install-Package Ninject.Web.Common.Webhost
这将为您创建文件。编码愉快!
答案 7 :(得分:0)
您需要安装Ninject.Web.Commom并创建文件
答案 8 :(得分:0)
这个技巧对我有用:
您的NinjectWebCommon.cs文件将保持不变!编码愉快!