最近、WCF サービス ライブラリを作成しました。IISでホストする予定です。リポジトリ レイヤーを再利用したいので、WCF サービスでも Ninject を使用することにしました (ソリューションの他のプロジェクトで使用しています)。
Ninject Wcf 拡張機能をインストールしました。svc ファイルの NinjectServiceHostFactory を使用して構成しました。NinjectWcfApplication から継承する CreateKernel() をオーバーライドするために Global.asax ファイルを追加しましたが、バインディングを正しく使用しているかどうかわかりません。私は最初に始めました:
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
しかし、データベースにデータが保存されていないため、これが機能しないことにすぐに気付きました。WCF サービスは ASP.NET パイプラインを使用していないようです。データがデータベースにコミットされているかどうかを確認するためだけに、これらの両方を試してみました。
Bind<IUnitOfWork>().To<UnitOfWork>().InThreadScope();
Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();
運がない。私はそれから試してみることにしました:
Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
これは機能しましたが、WCF サービスに着信するすべての要求でデータベース コンテキストを共有したくありません。その後、いくつかの調査を行い、次のアプローチを見つけました。
Bind<IUnitOfWork>().To<UnitOfWork>().InScope(c => OperationContext.Current);
これは機能しますが、正しいですか?MVC アプリケーションの InRequestScope に似たものが必要です。サービスへの各リクエストは、独自のデータベース コンテキストを取得する必要があります。