4

Windows サービスでホストされている WCF サービスを実行しています。WCF サービスの依存関係は Unity 経由で注入されますが、これはすべて良いことです。その結果、サービスの単体テストも簡単に作成できます。

最近、OperationContext を使用して着信メッセージを検査する機能をサービスに追加しました。残念なことに、Microsoft はシール クラスや静的クラスを好み、インターフェイスや仮想メソッドが不足しているため、サービスのテスト容易性はかなり損なわれています。

そこで私は、この状況で .NET のお気に入りのツールであるラッパー クラスに目を向けました。これは一般的な問題であるため、誰かがすでに私たちのために大変な作業を行っています。したがって、これにより、IOperationContext の実装である WCF サービスに新しい依存関係が追加されます。これは、単体テストでは問題ありませんでした。NSubstitute は、私が選択したモック フレームワークです (Moq のようですが、の呪いはありません.Object)。

ただし、実際にサービスを起動しようとすると、次の問題があります。ラップされている OperationContext は、IoC コンテナーの登録が行われた時点で初期化されていません。私の初期化コード(ここでは Unity を使用)は次のとおりです。

container.RegisterType<IOperationContext, OperationContextWrapper>(new InjectionConstructor(OperationContext.Current));

しかし、この時点でOperationContext.Currentnullであるため、Unity はすぐに例外をスローし、40 歳になる前に引退するという私の夢は煙に包まれました。

問題は、WCF で DI とラップされた をうまく処理するにはどうすればよいかということOperationContextです。

4

3 に答える 3

2

理解できないかもしれませんが、OperationContext.Current をラッパーに挿入する理由がわかりません。OperationContextWrapper が OperationContext をラップしている場合、その実装を必要な場所で OperationContext.Current と直接対話させないのはなぜですか? テスト可能にしようとしているコードは OperationContextWrapper ではなく、IOperationContext インターフェイスを介してそれに依存するコードだと思いますか? では、OperationContextWrapper が何をするかは誰が気にするでしょうか?

于 2011-07-13T04:50:13.520 に答える
1

Microsoft Fakes も使用できます。

using (ShimsContext.Create()) 
{
ShimOperationContext shimOperationContext = new
ShimOperationContext(); shimOperationContext.SessionIdGet = () => "sessionId";

OperationContext.Current = shimOperationContext;
}
于 2014-02-21T16:35:02.733 に答える
1

OperationContext.Current設定可能なプロパティです。テストの初期化を次のように変更できますか

OperationContext.Current = new OperationContextWrapper();

そして、それはそのように機能していますか?ユニティで必要な場合は、次のこともできます。

var oc = new OperationContextWrapper();
OperationContext.Current = oc;
container.RegisterInstance<IOperationContext>(oc);
于 2011-07-13T00:01:17.447 に答える