1

サービス層はコマンド側とクエリ側に分かれており、それぞれの側にハンドラーがあります。

次の構成が使用されます

// EF context
_container.RegisterPerWcfOperation<MyDbContext, MyDbContext>();
_container.RegisterManyForOpenGeneric(typeof(IHandler<>),
    ApplicationAssemblies);

// many more regs but nothing special

SimpleInjectorServiceHostFactory.SetContainer(_container);

および必要なマークアップ設定:

Factory="SimpleInjector.Integration.Wcf.SimpleInjectorServiceHostFactory, SimpleInjector.Integration.Wcf"

次の例外をスローします。

WCF スコープはネストできません。

エラーが発生すると思います

internal WcfOperationScope BeginScope()

WcfOperationScopeManager実装の。

背景情報:

  • WinForm アプリケーション
  • QueryClient の実行はバックグラウンドワーカーで行われます
  • Simple Injector バージョン 2.2.3 を使用しています
  • コンテナを構築する Global.asax
  • IIS でホストされる
  • 各 .svc には、使用するマークアップが設定されていますSimpleInjectorFactory
  • wsHttpBinding証明書とカスタムUserNamePasswordValidator
  • 各エンドポイント構成には、必要なすべての値が 2147483647 に設定されています。

2 つのロード要求を連続して高速に実行すると、エラーが発生するため、最初の要求が完了せず、2 番目の要求が発生します。

4

1 に答える 1

2

これは、一部の WCF 構成での Simple Injector 2.2.3 の既知の問題です。一部の WCF 構成では、 への 2 回目の呼び出しが強制されIInstanceProvider.GetInstanceます。メソッドは、1 つのスコープに限定さSimpleInjectorInstanceProvider.GetInstanceれた内部メソッドを呼び出します。BeginScope

次の 2 つの解決策があります。

最初の解決策は、最新のSimple Injector WCF Integrationパッケージにアップグレードすることです。WCF 統合パッケージの 2.3.0 リリースでは、この問題が修正されました。

2 番目の解決策は、WCF ごとの操作をまったく使用せずに、ライフタイム スコープを使用することです (これは、WCF ごとの操作のライフスタイルと同様に機能します)。コマンド ハンドラークエリ ハンドラーを使用するため、これは特にあなたの場合に適したソリューションです。つまり、WCF サービスはおそらく2 つの WCF 操作だけで構成されます。これにより、サービス内の他のすべての操作にコードを追加する必要があることを心配する必要なく、これら 2 つのメソッドをライフタイム スコープでラップすることが非常に簡単になります (サービスはそれ以上操作を取得しないため)。操作は次のようになります。

[OperationContract]
public object Execute(dynamic command)
{
    Type commandHandlerType = typeof(ICommandHandler<>)
        .MakeGenericType(command.GetType());

    using (Bootstrapper.BeginLifetimeScope())
    {
        dynamic commandHandler = Bootstrapper.GetInstance(commandHandlerType);

        commandHandler.Handle(command);
    }

    return command;
}

もちろん、WCF 操作ごとに行われたすべての登録は、Lifetime スコープに変更する必要があります。

_container.Register<MyDbContext, MyDbContext>(new LifetimeScopeLifestyle());
于 2013-06-19T13:41:50.957 に答える