我有一个名为IProcessor的接口,它有多个实现,如ABCProcessor,PQRProcessor。 我想根据外部参数使用特定的处理器。我怎样才能使用StructureMap实现相同的目标。
我正在查看相同的命名实例。
答案 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;
}
通过执行此操作,您可以在运行时委托正确的实现,而消费者仍然无视,以便您在运行时就此做出决定。现在,您不是向消费者注入ABCProcessor
或PQRProcessor
,而是向消费者注入ProxyProcessor
。例如,这就是ProxyProcessor
的对象图形如下所示:
IProcessor processor =
new ProxyProcessor(
abc: new ABCProcessor(),
pqr: new PQRProcessor(),
config: new SqlProcessorConfig("constr"));
请注意,此解决方案与使用工厂相比有几个好处,例如:
如果您想了解更多有关工厂几乎不是正确抽象的信息,请阅读this article。