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");

这段代码在不同的队列配置下被调用了大约 6 次,因为大部分TQueue是不同的对象。我们有一个情况TQueue是一样的(一个是初始生产,另一个是作为其他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 被注入。我试图只覆盖一个引擎的读者和另一个引擎的作者,让其他一切都是“默认值”。我错过了什么?

编辑:我缺少的一件事显然是我收到的错误消息——其中最重要的是“双向引用”。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