StructureMap - 注入条件类

时间:2016-11-01 15:52:29

标签: conditional structuremap

我有一个名为IProcessor的接口,它有多个实现,如ABCProcessor,PQRProcessor。 我想根据外部参数使用特定的处理器。我怎样才能使用StructureMap实现相同的目标。

我正在查看相同的命名实例。

2 个答案:

答案 0 :(得分:0)

您可以使用工厂模式:

public interface IProcessorFactory
{
    IProcessor Create(int dropDownValue);
}

public class ProcessorFactory : IProcessorFactory
{
    private readonly IContainer _container;
    public ProcessorFactory(IContainer container)
    {
        _container = container;
    }

    public IProcessor Create()
    {
        if(//your condition)
            return _container.GetInstance<ABCProcessor>();

        _container.GetInstance<PQRProcessor>();
    }
}

(或者只是注入所需的依赖项而不是容器) 然后简单地

private readonly IProcessorFactory _processorFactory;

public MvcController(IProcessorFactory processorFactory)
{
    _processorFactory = processorFactory;
}

public void Method()
{
    var processor = _processorFactory.Create();
}

答案 1 :(得分:0)

解决问题的最佳方法是通过实现IProcessor的代理实现来隐藏多个实现存在的知识以及消费者之间的选择:

public sealed ProxyProcessor : IProcessor
{
    private readonly ABCProcessor abc;
    private readonly PQRProcessor pqr;
    private readonly IProcessorConfig config;

    public ProxyProcessor(ABCProcessor abc, PQRProcessor pqr, IProcessorConfig config) {
        this.abc = abc;
        this.pqr = pqr;
        this.config = config;
    }

    // Implement IProcessor methods to forward to the CurrentProcessor.
    public void Process() => CurrentProcessor.Process();

    private IProcessor CurrentProcessor => config.ProcessorType == "ABC" ? abc : pqr;
}

通过执行此操作,您可以在运行时委托正确的实现,而消费者仍然无视,以便您在运行时就此做出决定。现在,您不是向消费者注入ABCProcessorPQRProcessor,而是向消费者注入ProxyProcessor。例如,这就是ProxyProcessor的对象图形如下所示:

IProcessor processor =
    new ProxyProcessor(
        abc: new ABCProcessor(), 
        pqr: new PQRProcessor(), 
        config: new SqlProcessorConfig("constr"));

请注意,此解决方案与使用工厂相比有几个好处,例如:

  • 它可以防止对消费者做出任何改变;消费者不会忘记。
  • 它可以防止向消费者引入不必要的复杂性;采用工厂方法,消费者必须处理额外的依赖。这使代码和测试变得复杂。
  • 它会导致以延迟方式构造对象图,这会使对象图的验证变得复杂。

如果您想了解更多有关工厂几乎不是正确抽象的信息,请阅读this article