3

最近、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 に似たものが必要です。サービスへの各リクエストは、独自のデータベース コンテキストを取得する必要があります。

4

2 に答える 2

3

CIサーバーhttp://teamcity.codebetter.comからの最新のビルドを確認することをお勧めします

Ninject、Ninject.Web.Common、Ninject.Extensions.Wcfが必要です

このバージョンでは、WcfにInRequestScopeを使用できます。

于 2011-10-12T15:42:19.530 に答える
1

私は Ninject を初めて使用しますが、これは Web アプリケーションの場合OperationContext.Currentと同等であると言えます。HttpContext.Current

だからあなたの最初の考えは.InRequestScope();(と同等です.InScope(c => HttpContext.Current);)を使用することでした

.InScope(c => OperationContext.Current);したがって、WCF の使用はかなり正しいと思います。

于 2011-10-12T12:45:32.603 に答える