1

これはオブジェクトモデルで理解できたと思いましたが、どうやらビットを不適切につなぎ合わせているようです。「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"));
4

0 に答える 0