web-dev-qa-db-ja.com

.NET Web Api2.1のNinjectバインディングでのパラメーターなしのコンストラクターエラー

現在APIサイト(.NET Web Api 2.1)の作成に取り組んでいます

以前のAPIサイトでは、Ninject.MVC3パッケージを使用し、依存関係リゾルバーとスコープを手動で接続し、推奨事項に従ってロジックをNinjectWebCommonにプラグインしていました。

これにより、新しいプロジェクトで胸焼けが発生し、パラメーターなしのコンストラクターエラーが発生していました。過去には、これはWebApiの依存関係リゾルバーを適切に接続していなかったことを諦めていました。今回だけでした。そこにあった。

var resolver = new NinjectDependencyResolver(kernel);
GlobalConfiguration.Configuration.DependencyResolver = resolver;

だから私は少し迷子になりました。先週、Ninjectが更新され、WebAPI nugetパッケージが復活したのを見て、実装してみることにしました。

NuGetパッケージNinject.Web.WebApi(バージョン3.2)をインストールしました。これには、バインディングを適用するためのNinectWebCommon.csファイルが含まれていないようです。必要なアセンブリのみを追加しました。掘り下げてみると、この実装に出くわしました。

https://Gist.github.com/odytrice/584201

(Nugetパッケージがこれを行っているかどうかはわかりませんでしたが、これはすべて冗長なコードです。そうであれば、nugetパッケージでバインディングを追加する方法を理解する必要があります。)

モジュールをロードする場合を除いて、この行を行に実装しました。テストとして3つの個別のモジュールをロードしました。

public static INinjectModule[] Modules
{
    //get { return new INinjectModule[] { new MainModule() }; }
    get { return new INinjectModule[] { new GlobalModule(), new InventoryModule(), new StoreModule() }; }
    }

依存関係リゾルバーがこの新しいコードで設定されていることを確認しました。

_resolver = new NinjectHttpResolver(modules);
GlobalConfiguration.Configuration.DependencyResolver = _resolver;

しかし、それでも問題は解決しません。

ExceptionMessage:

An error occurred when trying to create a controller of type 'StoreSearchController'.
Make sure that the controller has a parameterless public constructor.

スタックトレース:

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()

内部例外例外タイプ:System.ArgumentException

スタックトレース:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

私は途方に暮れています。 MVC依存関係リゾルバーも設定する必要があるという投稿をたくさん見ましたが、この場合、Ninjectを使用しないMVCコントローラーがホームコントローラーの外にないため、これが関連しているとは思いませんでした。

重要な場合と重要でない場合があるもう1つのヒント。属性ルーティングを使用しています。

どんな助けでも大歓迎です。

22
Khepri

ホスティングパッケージの1つをインストールする必要があります。

  • Ninject.Web.WebApi.WebHost
  • Ninject.Web.WebApi.SelfHost
  • Ninject.Web.WebApi.OwinHost
38
Remo Gloor

また、コンストラクターがパブリックであることを再確認してください。これは見落としがちです。

2
Aaron