我以为我已经用对象模型搞清楚了,但显然我一直在拼凑不正确的位。 “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"));