如何使用Windsor注入依赖于参数名称的不同依赖项

时间:2015-02-06 09:03:45

标签: c# .net dependency-injection castle-windsor

我的结构如下:

public class Processor<T>
{
    public Processor(IManager<T> xmlManager, IManager<T> memoryManager)
    {

    }
}

public interface IManager<T>
{

}

public class Manager<T> : IManager<T>
{
    private readonly IProvider _provider;

    public Manager(IProvider provider)
    {
        _provider = provider;
    }
}

public interface IProvider  {   }

public class XmlProvider : IProvider {  }

public class MemoryProvider : IProvider {   }

我需要向Processor类注入两个Manager类实例,但注入不同。我需要硬编码:

var p = new Processor<T>(new Manager<T>(new XmlProvider()) , new Manager<T>(new MemoryProvider()))

我还需要使用开放式泛型T来解决这个问题。

我无法弄清楚如何配置容器来管理它。我知道有.DependsOn(Property.ForKey("xmlManager").Eq()指令。但除了硬编码实现之外,我无法理解在Eq()中要写什么。提供者有自己的依赖关系。所以写.Eq(new Manager<T>(new XmlProvide(new OtherInjection(new AnotherOne()))))并不聪明。在那里,我不能使用开放的通用。

UPD 1 Mr NightOwl888。关于逻辑。一个提供程序用于将数据存储在内存Cache中。第二个提供程序用于存储将数据存储在xml文件中的数据。某种2级缓存模型。如果我交换两个参数(如Steven所说),它不会中断,但它不会像设计那样工作(导致检索信息的速度不同)。

1 个答案:

答案 0 :(得分:0)

我没与Windsor合作,但常见的解决方案似乎是

public class ManagerFactory // register it in container
{
   public IManager<T> Create<T>(IProvider provider) { return ... }
}

public class Processor<T>
{
    public Processor(ManagerFactory factory, IEnumerable<IProvider> providers)
    {
       myManagers = providers.Select(provider => factory.Create<T>(provider).ToList();
    }
}

通常,您可以注册一些接口的许多实现(在您的情况下为IProvider),因此容器可以全部注入