在给定特定请求类的情况下,如何让structuremap注入特定实例?

时间:2013-03-13 14:25:47

标签: c# dependency-injection structuremap

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

0 个答案:

没有答案