我以为我已经用对象模型解决了这个问题,但显然我一直不正确地拼凑在一起。“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"));