1

コンストラクターのパラメーターとして文字列を必要とするクラスがありますが、このパラメーターは呼び出し元のコードによって決定されます。同時に、このクラスの存続期間は HTTP 要求ごとに関連付ける必要があります。そこで、カスタムの PerWebRequestTimelineManager を作成し、それを構成ファイルのターゲット タイプに使用しました。しかし、コンストラクター内の文字列は動的に決定する必要があるため、構成ファイルを介して ConstructorInjection を使用することはできません。抽象ファクトリを使用して動的な依存関係の問題を解決できますが、実装についてはよくわかりません。以下のコードを確認して、アプローチを検証できますか。具体的には、RegisterType と Resolve の呼び出しは少し場違いに見えますが、アプリケーション全体での連続する Resolve 呼び出しは同じインスタンスを取得できます。

public class PerformanceTracerFactory : IPerformanceTracerFactory
{
    private readonly IPerformanceTracer tracer;

    public IPerformanceTracer CreateInstance(string operationTitle)
    {
        _container.RegisterType<IPerformanceTracer, PerformanceTracer>(new InjectionConstructor(operationTitle));

        return _container.Resolve<IPerformanceTracer>();
    }
}

構成ファイルの関連部分:

<register type="IPerformanceTracer" mapTo="PerformanceTracer">
  <lifetime type="PerWebRequest"/>
</register>
<register type="IPerformanceTracerFactory" mapTo="PerformanceTracerFactory"/>

別の質問があります。コードを使用して依存関係を構成および注入する上記の方法が正しい場合、構成エントリは必要ないと思います。適切なオーバーロードをいつでも使用して、カスタム ライフタイム マネージャーをプッシュできます。場合によっては、構成ファイルのみを使用して同じことを達成したいのですが、ソリューションをどのようにコーディングすればよいですか?

4

1 に答える 1

1

コンテナベースのファクトリを使用する場合、IPerformanceTracer呼び出しごとに登録/解決する必要はありません。

マッピングを登録しますIPerformanceTracer-->PerformanceTracer構成ファイルに一度、ParameterOverrideインターフェイスを解決するときに a を使用します。

public IPerformanceTracer CreateInstance(string operationTitle)
{
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle);
}
于 2012-02-20T15:23:41.387 に答える