11

私は立ち往生しています。WCF Web API Preview 5 で動作する wcf web api p6 Ninjectについてここで概説した方法を使用していましたが、ベータ版の mvc 実装では状況がかなり異なります。ここに良い記事がありますhttp://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver独自のカスタム依存関係リゾルバーの構築について説明していますが、私はしたいと思います私のmvcビューコントローラーに使用しているのと同じ実装を使用します...たとえば、Ninject. この記事の IoC Unity の例に基づいていくつか試してみましたが、まだうまくいきません。私を正しい方向に向ける助けがあれば、大歓迎です。自分もどんどん掘っていきます。前もって感謝します!

ここが私の居場所です。私は WebActivator を使用してコードをブートストラップしていましたが、それを Application_Start() にドロップして、方程式からもう 1 つ取り出しました。

    protected void Application_Start()
    {
        var kernel = new StandardKernel(new MyNinjectModule());
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }

次のエラーが表示されます:
タイプ Ninject.Web.Mvc.NinjectDependencyResolver は、Microsoft.Practices.ServiceLocation.IServiceLocator を実装していないようです。
パラメータ名: commonServiceLocator

解決策を見つけた
おそらくもっとエレガントな方法がある/あるでしょうが、これは今私のために働いています。ここにもカスタム メッセージ ハンドラを追加しています。

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
    public class ApiBootstrapper
    {
        public static void Start()
        {
            var kernel = new StandardKernel(new MyNinjectModule());
            var resolver = new NinjectDependencyResolver(kernel);
            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
        }
    }
}
4

5 に答える 5

3

私は WebAPI を使用したことはありませんが、IDependencyResolver のセマンティックは MVC3 のものとまったく同じであるため、同じ実装を使用できるはずです: https://github.com/ninject/ninject.web.mvc/blob/master /mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

更新: Ninject.Web.WebAPI 拡張機能により、ApiControllers のサポートが追加されます

于 2012-02-23T17:16:45.527 に答える
1

私は答えを見つけ、上記の質問を解決策で更新しました。ソリューション自体は、Web API Dependency Resolverの使用に関する記事に多かれ少なかれ存在していましたが、私はninjectを微調整し続ける必要がありました。どちらの回答も、これをすばやく絞り込むのに役立ちました。@Remoと@Jamesに感謝します。

于 2012-02-24T00:45:22.317 に答える
0

May sound silly but have you made sure you have a reference to the CommonServiceLocator / CommonServiceLocator.NinjectAdapter nuget package or associated assemblies. Your NinjectDependencyResolver may not be able to resolve the reference to IServiceLocator.

于 2012-02-23T19:08:19.387 に答える
0

ここで良い解決策を見つけました。

Ninject CommonServiceLocator / Bootstrapper を既に使用している場合は、非常に簡単です。

private static IKernel CreateKernel() {
   var kernel = new StandardKernel();
   RegisterServices(kernel);

   GlobalConfiguration.Configuration.ServiceResolver
      .SetResolver(new NinjectServiceLocator(kernel));
   return kernel; 
}
于 2012-03-30T14:09:34.840 に答える
0

同じコードが MVC と WebApi の両方で機能しますが、WebApi は MVC に触発されており、WebApi を使用するために MVC アセンブリを参照する必要がないため (またはその逆)、かなりの量のコードの重複があります。 2 つのフレームワークの間。MVC を使用する場合、依存関係は からSystem.Web.Mvc取得され、WebApi を使用する場合は を使用しますSystem.Web.Http。両方を使用する場合は、より明示的な名前空間の解決を使用して、どちらをいつ使用するかをコードで区別する必要があります。

あなたの問題は、MVCが最初に来て、NinjectDependancyResolverクラスがから継承することSystem.Web.Mvc.IDependencyResolverです。NinjectDependancyResolver クラスの正確な複製を作成し、代わりに継承する必要がありSystem.Web.Http.IDependencyResolverます。このクラスを使用して IoC をセットアップすれば、準備完了です。

于 2012-02-24T23:29:15.110 に答える