繁体   English   中英

如何使用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 {   }

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

我没有使用温莎,但常见的解决方案如下

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM