2012-02-20 12 views
1

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

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"/> 

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

答えて

1

コンテナベースの工場を使用する場合は、各呼び出しでIPerformanceTracerを登録/解決する必要はありません。

マッピングファイルIPerformanceTracer - >PerformanceTracerを設定ファイルに一度登録し、インターフェイスを解決するときにParameterOverrideを使用してください。

public IPerformanceTracer CreateInstance(string operationTitle) 
{ 
    return _container.Resolve<IPerformanceTracer>(new ParameterOverride("nameOfTheParameterInTheConstructorOfPerformanceTracer", operationTitle); 
} 
+0

セバスチャンに感謝します。それは問題を完全に解決しました。私は完全なAPIについての無知のために同様の問題を避けるために尋ねる別の賛成を持っています。 Unity APIドキュメンテーションを参照するのに最適な場所は何ですか? – koder

+0

@ user608100私はあなたを失望させますが、Unityドキュメンテーションは一般的に恐ろしいです。いくつかの情報は[MSDN](http://msdn.microsoft.com/en-us/library/ff663144.aspx)にあります。しかし、あなたは自分のものの大部分を把握しなければなりません。私は現在、CodePlex上のUnityサイトに置かれる2つの記事に取り組んでいます。これは、Unityの内部構造を少し明るくしています。しかし、翻訳にはもう少し時間がかかります。 –

関連する問題