Windows サービスでホストされている WCF サービスを実行しています。WCF サービスの依存関係は Unity 経由で注入されますが、これはすべて良いことです。その結果、サービスの単体テストも簡単に作成できます。
最近、OperationContext を使用して着信メッセージを検査する機能をサービスに追加しました。残念なことに、Microsoft はシール クラスや静的クラスを好み、インターフェイスや仮想メソッドが不足しているため、サービスのテスト容易性はかなり損なわれています。
そこで私は、この状況で .NET のお気に入りのツールであるラッパー クラスに目を向けました。これは一般的な問題であるため、誰かがすでに私たちのために大変な作業を行っています。したがって、これにより、IOperationContext の実装である WCF サービスに新しい依存関係が追加されます。これは、単体テストでは問題ありませんでした。NSubstitute は、私が選択したモック フレームワークです (Moq のようですが、の呪いはありません.Object
)。
ただし、実際にサービスを起動しようとすると、次の問題があります。ラップされている OperationContext は、IoC コンテナーの登録が行われた時点で初期化されていません。私の初期化コード(ここでは Unity を使用)は次のとおりです。
container.RegisterType<IOperationContext, OperationContextWrapper>(new InjectionConstructor(OperationContext.Current));
しかし、この時点でOperationContext.Current
はnull
であるため、Unity はすぐに例外をスローし、40 歳になる前に引退するという私の夢は煙に包まれました。
問題は、WCF で DI とラップされた をうまく処理するにはどうすればよいかということOperationContext
です。