Ninject.MVC5没有生成NinjectWebCommon.Cs

时间:2017-11-17 10:19:02

标签: c# asp.net-mvc nuget ninject

我正在Visual Studio 2017版本15.4上开发MVC5项目。我在这里得到了意想不到的结果,这是我以前从未遇到过的。我已经从Ninject.MVC5安装了nuget个软件包。它安装得很好,没有任何错误或警告。但问题是它没有在NinjectWebCommon.cs文件夹中生成App_Start文件。有什么理由吗?

9 个答案:

答案 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)

  1. 转到:项目的“管理nuget程序包”连接菜单。
  2. 选择已安装的软件包(届时您必须已安装ninject.mvc5)
  3. 更新所有已安装的关联ninject软件包。这可能包括:
    ninject.web.common, 注入 ninject.web.common.webhost

并且您在App_Start文件夹中拥有NinjectWebCommon.cs

答案 6 :(得分:0)

Install-Package Ninject.Web.Common.Webhost这将为您创建文件。编码愉快!

答案 7 :(得分:0)

您需要安装Ninject.Web.Commom并创建文件

答案 8 :(得分:0)

这个技巧对我有用:

  1. 首先将所有与Ninject相关的软件包依赖项降级到3.2.0版。
  2. 现在,您将在App_Start中拥有NinjectWebCommon.cs文件。
  3. 根据您的要求编辑文件。
  4. 访问Package Manager UI,它将自动开始,要求您将所有Ninject依赖项升级到最新的依赖项!

您的NinjectWebCommon.cs文件将保持不变!编码愉快!