2017-01-17 6 views
0

のコレクションを注入(と答えていた):私のレジストリでStructure Map - Collection of Dependencies in Constructor構造マップは、 - この質問は、私が以前に尋ねてきた質問に非常によく似ている名前付きインスタンス

を私は次があります。

For<IMyObject>().Add<MyObjectType1>().Named("Type1"); 
For<IMyObject>().Add<MyObjectType2>().Named("Type2"); 
For<IMyObject>().Add<MyObjectType3>().Named("Type3"); 

Iすべてのインスタンスをコンストラクタに挿入して、名前付きインスタンスを取得できるようにします。サンプルコード(のStructureMap例外を生成します):このアプローチの

public class Example 
{ 
    private Dictionary<string, IMyObject> _workers; 

    public Example(Dictionary<string, IMyObject> workers) 
    { 
    _workers = workers; 
    } 

    public void DoSomeStuff(string mode) 
    { 
    var worker = _workers[mode]; 
    worker.DoStuff(); 
    } 
} 

私の推論は何かが(上記の例で「モード」で名前付きインスタンスに対応するであろう)に対処する方法を指定するために、外部の構成を可能にすることです。

次のように実際の例外がある:

StructureMap.StructureMapException occurred 
    ErrorCode=202 
    HResult=-2146232832 
    Message=StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily 

私は名前付きインスタンスを取得するために私の方法DoSomeStuff中のStructureMapコンテナを使用することができることを承知していますが、これはアンチパターンのようなものです。だから私の質問を明確にする

  • は、私は名前によってそれらを参照することができるように、名前付きインスタンスの辞書(またはその他のコレクション)を注入することはできますか?

これは明らかですが、これ以上の説明が必要な場合はご返信ください。

  • C#の:4.0
  • のStructureMap:代わりに辞書を注入2.5.4.0

おかげで、

グレアム

答えて

2

、代わりにFunc<string, IMyObject>を注入した方がよいかもしれません。

For<Example>() 
    .Use(() => new Example(mode => container.GetInstance<IMyObject>(instanceKey: mode))); 
+0

おかげ@Stevenを次のように

public class Example { private Func<string, IMyObject> _workers; public Example(Func<string, IMyObject> workers) { _workers = workers; } public void DoSomeStuff(string mode) => _workers(mode).DoStuff(); } 

あなたはあなたのExampleを登録することができます。それらの一方のみが実際に使用する必要がありながら、これは、すべての依存関係を持つすべてのIMyObjectインスタンスを作成することからのStructureMapを防止します応答する時間を取るために。 Exampleの1つのインスタンスは、繰り返し呼び出しによって、ある時点でIMyObjectのすべてのインスタンスを使用します。このサンプルクラスは主に、IMyObjectの正しい実装を指示する責任があります。例calssが要求されたときにレジストリに辞書を新しくできたと知っていますが、より洗練されたソリューションがほしいと思っています – GinjaNinja

+0

@GinjaNinja:私は最も洗練されたソリューションを見つけました。なぜこのソリューションはあなたのために働いていないのですか? – Steven

+0

お詫び申し上げますが、私はそこで印を少し離れていたかもしれません。あなたの解決策は私のために働き、私は答えを受け入れます。私は、クラスのサンプルを追加することなく、ある種のコレクションに含まれるすべてのインスタンスを取得する方法が組み込まれていることを期待していました。 1つの質問として、IMyObjectの各実装の1つのオブジェクトのみが作成されるようにする方法を認識していますか? – GinjaNinja

関連する問題