12

このような質問がいくつかあることは知っていますが、ドキュメントを見つけることができず、他の質問に役立つ回答がないため、次のようになります。

新しい ASP.NET アプリケーション (VS2013) を作成し、MVC を選択して、API を追加します。Package Console で「update-package」を実行して、最新バージョン (MVC 5.1.2、Web Api 5.1.2) に更新します。

次に、新しいNinject.MVC5およびNinject.Web.WebApiパッケージを追加します。

これらの行を web.config ファイルに追加します (Ninject はバージョン 5.0 を必要としますが、私は 5.1 を持っています)。

        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
        </dependentAssembly>

App_start/NinjectWebCommon.cs ファイルに、1 つのバインドを追加します。

    private static void RegisterServices(IKernel kernel) {
        kernel.Bind<ILogger, NLogLogger>();
    }

次に、ILogger をコンストラクターの単一パラメーターとして使用して単一の ApiController を追加し、ILogger をパラメーターとして HomeController のコンストラクターに追加します。

それはテストのためのものですか?

WebApi の配線が不足していますか? それとも「舞台裏」で起こっているのでしょうか?

とにかく、APIコントローラーにアクセスすると、次のエラーが表示されます:

タイプ 'TestController' のコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリック コンストラクターがあることを確認します。

HomeController を試すと、次のようになります。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

最新のパッケージに更新せずに、同じ問題を試しました。私は MVC 3 で何年も Ninject を使用してきました (Ninject.MVC3 パッケージも試しました) が、なぜそれが機能しないのかまったくわかりません。WebApi では、SetResolver への呼び出しを期待していましたが、..

どんな助けでも感謝します!

4

3 に答える 3

10

これは MVC/WebApi の問題ではありません

あなたの設定は間違っています:

kernel.Bind<ILogger, NLogLogger>();

する必要があります

kernel.Bind<ILogger>().To<NLogLogger>();
于 2014-05-01T09:12:51.317 に答える
4

プロジェクトで Ninject を使用するには、次のパッケージをインストールする必要がMVCありWebApiます。

-Ninject
-Ninject.MVC5
-Ninject.Web
-Ninject.Web.Common
-Ninject.Web.Common.WebHost
-Ninject.Web.WebApi
-Ninject.Web.WebApi.WebHost

これらのパッケージは、次のファイルをApp_Startフォルダーに追加します:
NinjectWeb.cs:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Smartiz.UI.NinjectWeb), "Start")]

namespace Smartiz.UI
{
    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject.Web;

    public static class NinjectWeb 
    {
        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        }
    }
}

NinjectWebCommon.cs:

using System;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Extensions.Conventions;
using Ninject.Web.Common;
using Smartiz.ClientServices;
using Smartiz.UI;
using WebActivatorEx;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")]
[assembly: ApplicationShutdownMethod(typeof(NinjectWebCommon), "Stop")]

namespace Smartiz.UI
{
    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>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            //kernel.Bind(q =>
            //  q.FromAssembliesMatching("Smartiz.ClientServices*")
            //  .SelectAllClasses()
            //  .InheritedFrom(typeof(BaseService))
            //  .BindDefaultInterface()
            //  .Configure(c => c.InSingletonScope()));
        }        
    }
}
于 2015-12-12T04:57:48.320 に答える