2017-01-23 1 views
0

タイプを解決するときに、サービスの特定のインスタンスをどのように注入できるかを判断しようとしています。単純なインジェクターパラメータのオーバーライド

IFoo fooService = Container.Resolve<IFoo>(); 
fooSerivce.DoBar("someParameter"); 
ParameterOverrides overrides = new ParameterOverrides() 
{ 
    { "fooService", fooService } 
}; 
return Container.Resolve(type, overrides); 

がどのように私はシンプルなインジェクタでこれを達成するでしょう :

Unityで例えば私のような何かをするのでしょうか?

+0

これが必要なときの具体例を表示できますか? – Steven

+0

この例は、[Prism Library](https://github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/Prism.Unity.Forms/PrismApplication.cs#L25) –

答えて

1

Simple Injectorには、コンテナの 'resolve'メソッドを提供するための組み込みサポートがありません。なぜなら、この主な使用例は、注入コンストラクタにランタイムデータを与えることが一般的でないためです。ランタイムデータに依存するアプリケーションコンポーネントの構築は、詳細パターンhereのように、アンチパターンです。

これを回避できない場合もありますが、これは主に、変更の対象外となる第三者の枠組みやフレームワークとの統合時に発生します。このような場合は、ページとナビゲーションサービスとの間に周期的な依存関係があることを想定して設計されているように思われるプリズムを使用することができます。プリズムがこれを行う主な理由です。

this特にQ & Aをご覧ください.Prismと同じデザインのWebFromsMvpについて説明しています。質問と回答はSimple Injectorでこれを非常に効果的に回避する方法を説明しています。

、あなたの質問に表示例からUPDATE

、あなたがコンテナから解決されたサービスを注入するので、まったくオーバーライドを使用する必要があるようではありません。代わりに、次の操作を行うことができます限りIFooScopedまたはSingletonライフスタイルに登録されているよう

IFoo fooService = Container.GetInstance<IFoo>(); 
fooSerivce.DoBar("someParameter"); 
return Container.GetInstance(type); 

を、そしてtypeはそのコンストラクタでIFooを受け入れ、同じインスタンスがrevoled typeを注入しています。

+0

をサポートしています他のフレームワークでは、アンチパターンの使用を含む妥協を余儀なくされることがあります。これは本当に手にした質問に答えるのに役立つものではありません。作成されるオブジェクトを制御できないため、単に型を解決してからプロパティを設定することはできません。指定された型は、インスタンスの作成時にコンストラクタに注入する必要があります。 –

+1

この回答に記載されているstackoverflowの答えは、この問題の解決方法を示しています。そうでない場合は、提示された方法が機能しない理由を説明してください。 – Steven

+0

おそらく私はここで何かを見逃していますが、あなたが参照した投稿の答えから、以前にコンテナに登録されていないサービスを登録しています。この特定のケースでは、Transientライフスタイルに登録されたサービスを解決しています。そのインスタンスに何かをしてから、解決したいタイプのものが必要な場合はそのインスタンスを注入する必要があります。私はそれが理想的ではないパターンだと理解していますが、この特定のケースでは私が採用しなければならないものです。 –