ここに、私のソリューションとそれらが実装するインターフェイスのいくつかのクラスの単純化バージョンがあります。彼らは両方とも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>();
ありがとうございました、特にリンクを更新していただきありがとうございます。間違いなく、これは正解です。しかし、私が理解していないことは、私が過去に投稿したコードが私のために働いていたことです。私は二重チェックして、私はそれが既存のコードで動作して見ることができます。どのように考えられるか? – getsetcode