現在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つのヒント。属性ルーティングを使用しています。
どんな助けでも大歓迎です。
ホスティングパッケージの1つをインストールする必要があります。
また、コンストラクターがパブリックであることを再確認してください。これは見落としがちです。