3

私はこれを行います: https://stackoverflow.com/questions/12069002/autofac-resolve-with-and-without-named-parameter

インターフェイスを登録します。初期化にはパラメータが必要です。最初の呼び出しでは、このパラメーターが渡されます。

別の場所でも、このインターフェイスのインスタンスを解決したいのですが、このパラメーターを渡すことができません。このインターフェイスが既に解決されているかどうかを確認することはできますか (現在のスコープで。私は ASP.NET WEB API を使用しています)。パラメータなしで解決すると、例外が発生します。

現在の HttpRequest スコープで既に解決されているかどうかを確認する必要があります (既に解決されている場合は、登録された作成デリゲートが 2 回呼び出されないため、パラメーターを渡さずに取得できます)

m_builder.Register<IMyClass((c, p) =>
    {
        //...
        return new MyClass;

    }).InstancePerHttpRequest();//.InstancePerApiRequest();
4

1 に答える 1

6

まず、インスタンスが解決されたかどうかを追跡できるクラスを作成します。

public class Tracker
{
    public bool IsResolved { get; set; }
}

(これを少しきれいにしたいかもしれません:))

追跡したいものと同じスコープで登録します。

builder.RegisterType<Tracker>()
    .InstancePerHttpRequest();

次に、OnActivatedイベントで bool を設定します。

builder.Register((c, p) => {
        return new MyClass();
    })
    .As<IMyClass>()
    .InstancePerHttpRequest()
    .OnActivated(e => {
        e.Context.Resolve<Tracker>().IsResolved = true;
    });

アクティブ化中に (最初のデリゲートで) フィールドを設定することもできますが、OnActivatedイベントを使用すると、必要に応じてこれを簡単に一般化できます。

最後に、フィールドを確認するには:

if (container.Resolve<Tracker>().IsResolved) { ... }
于 2012-08-24T01:36:55.603 に答える