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

How to inject different dependencies that depends on argument name using 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 {   }

我需要向处理器 class 注入管理器 class 的两个实例,但注入方式不同。如此硬编码我需要:

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 NightOwl888 先生。关于逻辑。一个提供程序用于将数据存储在内存缓存中。第二个提供程序用于存储 xml 文件中的数据存储数据。某种二级缓存模型。如果我交换两个参数(如史蒂文所说),它不会中断,但它不会像设计的那样工作(信息检索速度不同的原因)。

我没有使用 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),因此容器可以将它们全部注入