2016-06-21 7 views
0

私は2つのクラスがあり、それぞれSingletonWorkerScopedWorkerをSingletonとScopedのライフスタイルに登録してみましょう。どちらもコンストラクタ内のIMetricSubmitterに依存しています。ワーカーはIMetricSubmitterを使用してロジックの一部としてメトリックを送信します。私はSingletonWorkerDefaultMetricSubmitterで終わるだろうとScopedWorkerDefaultMetricSubmitterを飾るEnrichMetricsDecoratorで終わるだろうということなScopedWorker依存、目的のためにEnrichMetricsDecoratorを飾るのが好きDefaultMetricSubmitter呼ばIMetricSubmitterのシングルトン実装では、あります。今日SimpleInjectorを使用してそのような登録を作成する方法はありますか?Simple Injectorを使用して消費者のライフスタイルに基づいて条件付きでデコレータを登録する方法は?

オブジェクトグラフは基本的に次のようになります。それはデコレータを登録する方法であるRegisterDecoratorで、消費者を知っている述語を有し、RegisterConditionalを組み合わせるように見える私には

var singleton = new SingletonWorker(
    new DefaultMetricSubmitter()); 

var scoped = new ScopedWorker(
    new EnrichMetricsDecorator(
     new DefaultMetricSubmitter())); 

が、私は2つを組み合わせる方法を知らない。理想的には、消費コンストラクタの依存関係として要求されたときにアクティブなスコープがあるかどうかに基づいてデコレータを登録し、その場合はそのアクティブスコープのデコレータインスタンスを作成します。議論の目的のために、範囲はLifetimeScopeであると仮定することができる。

答えて

1

RegisterDecoratorの方法を使用して行うことはできません。代わりに、RegisterConditionalメソッドを使用するように戻す必要があります。

container.Register<ScopedWorker>(Lifestyle.Scoped); 
container.Register<SingletonWorker>(Lifestyle.Singleton); 

container.RegisterConditional<IMetricSubmitter, EnrichMetricsDecorator>(
    Lifestyle.Scoped, 
    c => c.Consumer.ImplementationType == typeof(ScopedWorker)); 

container.RegisterConditional<IMetricSubmitter, DefaultMetricSubmitter>(
    Lifestyle.Singleton, 
    c => c.Consumer.ImplementationType == typeof(EnrichMetricsDecorator)); 

この練習では、ドキュメントにhereに記載されている:あなたの指定されたオブジェクトのグラフを考慮すると、これらの登録は、次のようになります。

あなたの更新されたオブジェクトのグラフでUPDATE

(つまり、余分なシングルトンデコレータを含みます)、次のように、登録が見えるかもしれません:

// Useful helper method 
static bool InjectedInto<TConsumer>(PredicateContext c) => 
    c.Consumer.ImplementationType == typeof(TConsumer); 

container.Register<ScopedWorker>(Lifestyle.Scoped); 
container.Register<SingletonWorker>(Lifestyle.Singleton); 

container.RegisterConditional<IMetricSubmitter, DefaultMetricSubmitter>(
    Lifestyle.Singleton, 
    InjectedInto<CachingMetricSubmitterDecorator>); 

container.RegisterConditional<IMetricSubmitter, CachingMetricSubmitterDecorator>(
    Lifestyle.Singleton, 
    c=> !InjectedInto<ScopedWorker>(c)&&!InjectedInto<CachingMetricSubmitterDecorator>(c)); 

container.RegisterConditional<IMetricSubmitter, EnrichMetricsDecorator>(
    Lifestyle.Scoped, 
    InjectedInto<ScopedWorker>); 
+0

文書によると、この登録は 'を持っていません。 EnrichMetricsDecorator'がシングルトン 'DefaultMetricsSubmitter'を装飾しています、間違っていますか? – Eldar

+0

申し訳ありませんが、よく読んでいませんでした。私が必要とするものを正確に見て、それをチェックします。ありがとう:) – Eldar

+0

こんにちはスティーブン、あなたの提案が働いたが、私はもう少し複雑なオブジェクトのグラフが失敗した。上記の例を続けると、 'DefaultMetricSubmitter'は常にシングルトン' CachingMetricSubmitterDecorator'で装飾され、 'CachingMetricSubmitterDecorator'は消費者が' Scoped'ライフスタイルを持つという条件に基づいて 'EnrichMetricsDecorator'で装飾されるべきです。したがって、 'SingletonWorker'は' DefaultMetricsSubmitter'を装飾する 'CachingMetricSubmitterDecorator'を受け取るべきです。私はこれにどのようにアプローチすべきですか? – Eldar

関連する問題