web-dev-qa-db-ja.com

Ninject.MVC5はNinjectWebCommon.Csを生成しません

Visual Studio 2017バージョン15.4でMVC5プロジェクトを開発しています。ここで、今まで直面したことのない予期しない結果が得られています。 nugetからNinject.MVC5パッケージをインストールしました。うまくインストールされており、エラーや警告は表示されません。しかし問題は、NinjectWebCommon.csフォルダーにApp_Startファイルが生成されないことです。理由はありますか?

17
Jaber Kibria

多くの検索とテストの後、システムが以前の回答で一度に複数のインスタンスを作成しようとしていたときにエラーに直面した正確な解決策を手に入れました。ここでは、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()
        });
    }
}

しかし、ここにパラメータ化されたコンストラクタの問題があります。この問題を回避するために、Concrete Instanceを作成するメソッドを追加しました。これが更新されたコードです。

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

最新のNinject.Web.Common.WebHost 3.3.0 NuGetパッケージにはNinjectWebCommon.csが含まれていないようです。 3.2.0などの古いバージョンには、このファイルが含まれています。

Ninject.Web.Common.WebHost 3.3.0は、NinjectWebCommon.csから派生して使用できるNinjectHttpApplicationクラスを提供します。 Ninjectのwikiドキュメントは更新されていないようですが、NinjectHttpApplicationの使用は文書化されたアプローチの1つであるように見えます

マットのコメントを参照してください- Web API2 NinjectWebCommon.csは表示されません

16
Joe

NugetパッケージからNinject.MVC5をインストールし、バージョン3.2.1を維持最新の3.3.0バージョンでは、NinjectWebCommon.csファイルが追加されていなかったため、バージョンをダウングレードしました。

ハッピーコーディング!

3
Vinayak Savale

以下のパッケージをすべてインストールすると、自動的に動作します。

パッケージ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 version = 3.3.0 targetFramework = net451 package id = Ninject.Web.Commonenter code here version = 3.3.1 targetFramework = net451 package id = Ninject.Web.Common.W

2
Ravi Indra

私は同じ問題に直面していましたが、これを修正するために、Ninjectパッケージのバージョンを3.2.2に変更しました。(ダウングレード)これを行うと、NinjectWebCommon.csが生成されます。 Ninjectパッケージの。プロジェクトを実行します。プロジェクトは適切に実行されます。

0
Shweta Verma