1

Autofac で Web API OWIN パイプラインを使用する場合の一時的な要求スコープの作成について質問があります。

QA チームがネガティブなテスト ケースをテストできるように、一部の外部依存関係を必要に応じて無効にする必要があります。私は通常のアプリケーション フローでコードを変更したくなかったので、特定の QA ヘッダーの要求を検査するカスタム ミドルウェアを作成し、それらが存在する場合は通常のコンテナーを一時的な新しいスコープで拡張し、置換を登録しました。オブジェクトはその呼び出しに対してのみ、autofac:OwinLifetimeScope をオーバーライドし、その呼び出しの最後にその一時的なスコープを破棄します。

これにより、そのリクエストに対してのみコンテナの通常の動作をオーバーライドできるようになりましたが、他のすべてのリクエストは通常​​どおり続行できます。

これは私のミドルウェアの変更されたサンプルです。このコードは期待どおりに完全に機能しています。

public override async Task Invoke(IOwinContext context)
{
    var headerKey = ConfigurationManager.AppSettings["QaTest.OfflineVendors.HeaderKey"];

    if (headerKey != null && context.Request.Headers.ContainsKey(headerKey))
    {
        var offlineVendorString = context.Request.Headers[headerKey].ToUpper(); //list of stuff to blow up

        Action<ContainerBuilder> qaRegistration = builder =>
        {
            if (offlineVendorString.Contains("OTHERAPI"))
            {
                var otherClient = new Mock<IOtherClient>();
                otherClient.Setup(x => x.GetValue()).Throws<APIServiceUnavailableException>();
                builder.Register(c => otherClient.Object).As<IOtherClient>();
            }
        };

        using (
            var scope =
                context.GetAutofacLifetimeScope()
                    .BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag, qaRegistration))
        {
            var key = context.Environment.Keys.First(s => s.StartsWith("autofac:OwinLifetimeScope"));
            context.Set(key, scope);

            await this.Next.Invoke(context).ConfigureAwait(false);
        }
    }
    else
    {
        await this.Next.Invoke(context).ConfigureAwait(false);
    }
}

ただし、行は

var key = context.Environment.Keys.First(s => s.StartsWith("autofac:OwinLifetimeScope"));
context.Set(key, scope);

非常にハックなようで、私はそれらが好きではありません。あらゆる場所を検索しましたが、コンテキスト オブジェクトをきれいにオーバーライドする方法や、この機能を実装するより良い方法を見つけられませんでした。

これを処理するためのより良い方法についての提案を探しています。

4

1 に答える 1