これはオブジェクトモデルで理解できたと思いましたが、どうやらビットを不適切につなぎ合わせているようです。「queueName」は親メソッドのFuncであり、最終的に文字列を返すだけです。
私は次の依存関係を追加しています:
conf.For<IMessageQueueFactory<TQueue>>()
.Use<MicrosoftMessageQueueFactory<TQueue>>()
.Named(instanceName)
.Ctor<string>("path")
.Is(context => queueName(context.GetInstance<IProjectSettings>()))
.Ctor<QueueAccessMode>("queueAccessMode")
.Is(QueueAccessMode.SendAndReceive)
.Ctor<int>("readTimeoutMilliseconds")
.Is(60000);
conf.For<IMessageQueueReader<TQueue>>()
.Use(context => context.GetInstance<IMessageQueueFactory<TQueue>>().CreateMessageQueueReader())
.Named(instanceName + ".reader");
conf.For<IMessageQueueWriter<TQueue>>()
.Use(context => context.GetInstance<IMessageQueueFactory<TQueue>>().CreateMessageQueueWriter())
.Named(instanceName + ".writer");
TQueue
このコードブロックは、ほとんどの場合異なるオブジェクトであるため、異なるキュー構成で約6回呼び出されます。同じ場合TQueue
(1つは初期本番、もう1つは他の5つの領域のエラー処理キューとして)があるため、どちらを注入するかを制御する必要があります。そのため、インスタンスはすべて名前が付けられます。
conf.For<IMessageQueueReader<CopiedObject>>()
.ConditionallyUse(a => a.If(c => typeof(FooEngine).IsAssignableFrom(c.ParentType))
.ThenIt.Is.TheInstanceNamed("queue.copiedobject.writer"));
conf.For<IMessageQueueWriter<CopiedObject>>()
.ConditionallyUse(a => a.If(c => typeof(BarEngine).IsAssignableFrom(c.ParentType))
.ThenIt.Is.TheInstanceNamed("queue.copiedobject.reader"));
これに含まれるすべての*Engineオブジェクトには、IQueueReaderとIQueueWriterが挿入されています。あるエンジンのリーダーと別のエンジンのライターだけをオーバーライドし、他のすべてを「デフォルト」にしようとしています。私は何が欠けていますか?
編集:私が見逃していることの1つは、明らかに私が受け取るエラーメッセージです-すべてのもののどれが「双方向参照」です。IMessageQueueReaderまたはIMessageQueueWriterについては、同じアセンブリ内にさえないため、私が書いているものはまったく必要ありません。c.ParentType
部分的なインスタンス化が必要な部分ですか?
EDIT2:オーバーライドを次のコードに変更するとエラーは停止しますが、StructureMapはオーバーライドされたオブジェクトを使用していません。まだデフォルトを使用しています:
conf.ForConcreteType<FooEngine>().Configure
.Ctor<IMessageQueueWriter<FetchedEmail>>()
.Is(i => i.TheInstanceNamed("queue.copiedobject.writer"));
conf.ForConcreteType<BarEngine>().Configure
.Ctor<IMessageQueueReader<FetchedEmail>>()
.Is(i => i.TheInstanceNamed("queue.copiedobject.reader"));