【问题标题】:Injecting correct object graph using StructureMap in Queue of different Objects在不同对象的队列中使用 StructureMap 注入正确的对象图
【发布时间】:2013-11-08 11:50:44
【问题描述】:

我有一个队列服务,它必须根据队列中对象的类型注入不同的依赖关系图。我正在使用Structure Map

因此,如果队列中的对象是TypeA,则使用TypeA 的具体类,如果是TypeB,则使用TypeB 的具体类。

我想避免队列中的代码,例如:

if (typeA)
{
   // setup TypeA graph
}
else if (typeB) {
   // setup TypeB graph
}

在图中,我还有一个泛型类,例如IReader(ISomething, ISpomethingElse),其中IReader 是泛型的,但需要为该类型注入正确的ISomethingISomethingElseISomething 也会有依赖等等。

目前我创建了一个TypeATypeB 对象并使用StructureMap 将一个通用处理器类注入其中,然后将factory 手动注入一个TypeATypeB 工厂到如下方法:

Processor.Process(new TypeAFactory)  // perhaps I should have an abstract factory...

但是,由于工厂随后创建了上面提到的通用 IReader,因此我最终手动注入了所有 TypeA 或 TypeB 类。

我希望这足够有意义。

我是 StructureMap 的新手,希望有人可以在这里为我指明正确的方向,以获得灵活而优雅的解决方案。

谢谢

【问题讨论】:

  • 我不认为我真的理解你的问题。您能否创建一些我们可以使用的简化工作代码示例。其次,更好地定义队列中的内容。您可以访问那里的容器吗?

标签: dependency-injection structuremap abstract-factory


【解决方案1】:

我不知道我是否完全理解您的问题,但一般来说,您的队列处理器需要访问某种工厂来处理这些对象。最方便的方法是,如果您的队列由消息/命令 (DTO) 组成,并且您对命令处理逻辑有某种抽象,例如 ICommandHandler<TCommand>

在这种情况下,您的队列处理器可能如下所示:

private readonly ICommandHandlerFactory factory;

public void Process(IEnumerable<object> commandQueue)
{
    foreach (object command in commandQueue)
    {
        dynamic handler = this.factory.CreateHandlerFor(command.GetType());

        handler.Handle((dynamic)command);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多