1

ここに、私のソリューションとそれらが実装するインターフェイスのいくつかのクラスの単純化バージョンがあります。彼らは両方とも1つのインタフェースを共有し、専用のインタフェースも実装します。名前付きインスタンスが期待どおりに機能していないStructureMap 4

public interface ISharedContract 
{ 
    void ImplementSharedContract(); 
} 

public interface IConcreteOne 
{ 
    void ImplementConcreteOne(); 
} 

public interface IConcreteTwo 
{ 
    void ImplementConcreteTwo(); 
} 

public class ConcreteOne : BaseConcrete, IConcreteOne, ISharedContract 
{ 
    public void ImplementSharedContract() 
    { 
     this.ImplementConcreteOne(); 
    } 

    public void ImplementConcreteOne() 
    { 
    } 
} 

public class ConcreteTwo : BaseConcrete, IConcreteTwo, ISharedContract 
{ 
    public void ImplementSharedContract() 
    { 
     this.ImplementConcreteTwo(); 
    } 

    public void ImplementConcreteTwo() 
    { 
    } 
} 

次のように私のStructureMapレジストリは、これらの依存関係を登録します。私はあることを観察実行時に

public MyDependent(ISomethingElse somethingElse, ISharedContract cOne, ISharedContract cTwo) 
{ 
    this.collection = new List<ISharedContract>() 
    { 
     cOne, 
     cTwo 
    }; 
} 

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     this.For<ISharedContract>().Use<ConcreteOne>().Named("cOne"); 
     this.For<ISharedContract>().Use<ConcreteTwo>().Named("cTwo"); 
     this.For<IConcreteOne>().Use<ConcreteOne>(); 
     this.For<IConcreteTwo>().Use<ConcreteTwo>(); 
    } 
} 

は最後に、私は次のようにコンストラクタでこれらの依存関係を注入するクラスを持っていますcOneとcTwoはともにConcreteTwoのインスタンスに挿入されています。 Structure Mapレジストリで2つの名前付き登録の順序を入れ替えた場合、cOneとcTwoはともにConcreteOneのインスタンスになります。

名前付きインスタンスを初めて使用したわけではありませんが、以前はこれを確認していません。私は行方不明のものがありますか?私は、名前付きメソッドに渡された値がコンストラクタ内のパラメータ名と対応していることを確認し、再度確認しました。ここで

更新

は、私の場合を例に作業を行うために必要とされている更新レジストリエントリです。私は必要な情報のためのジェレミー・D・ミラー@のおかげ:

this.For<IMyDependent>().Use<MyDependent>() 
    .Ctor<ISharedContract>("cOne").Is<ConcreteOne>() 
    .Ctor<ISharedContract>("cTwo").Is<ConcreteTwo>(); 

答えて

2

はのStructureMapは、その型の名前付きインスタンスにコンストラクタのパラメータ名を一致さここに魔法の機能を持っていません。あなたは明示的にこの場合は、インラインの依存関係をマッピングする必要があります:このコードでhttp://structuremap.github.io/registration/inline-dependencies/

this.For<ISharedContract>().Use<ConcreteOne>().Named("cOne"); this.For<ISharedContract>().Use<ConcreteTwo>().Named("cTwo");

あなたはすぐにConcreteTwoにそれを上書きし、その後、ConcreteOneにデフォルトISharedContextを設定しています。この場合、最後の1つが勝ちます。 MyDependentクラスを作成する場合、StructureMapは自動配線を使用して、ISharedContextのデフォルトインスタンスをプッシュします。

+0

ありがとうございました、特にリンクを更新していただきありがとうございます。間違いなく、これは正解です。しかし、私が理解していないことは、私が過去に投稿したコードが私のために働いていたことです。私は二重チェックして、私はそれが既存のコードで動作して見ることができます。どのように考えられるか? – getsetcode

関連する問題