使用 Pico Container 注册一个实现列表

Register a list of implementations with Pico Container

我有接口

public interface IInterface{}

我有这个接口的实现列表:

public class MyClass1 implements IInterface{}
public class MyClass2 implements IInterface{}

我想用 Pico Container 做什么:

  1. 注册 IInterface 的所有实现,以便能够将它们解析为列表:

    public class MyTest {
        public MyTest(IInterface[] list){}
    }
    
  2. 另一个选项是能够使用命名键注册实现:

    container.addComponent(IInterface.class, MyClass1.class, "name1");
    container.addComponent(IInterface.class, MyClass2.class, "name2");
    

    能够做类似的事情:

    container.getComponent(IInterface.class, "name2");
    

是否有至少第一个问题的内置解决方案?

UPD

  1. 发现 Pico 中的此实现很奇怪且不直观。

为了能够注入数组,有必要:

container.addComponent(MyClass1.class);
container.addComponent(MyClass2.class);
container.addComponent(MyTest.class);
MyTest test = container.getComponent(MyTest.class);

这将注入所有实现的数组。但这种行为非常不明确且不直观。我还是注册pair比较好

第 1 部分与您描述的完全一样。只需以通常的方式注册任意数量的实现,然后它们可以作为数组注入(不需要任何注入参数)或 collection. You can see example with array in sample project // ServerRegistrar, AppPico

对于第二部分,有几个内置的解决方案,例如使用我个人不赞成的命名注释(就像在 Guice 中一样)。或者使用 injection parameters(接近您的期望)。或者使用一些我可以详细解释的自定义方法,如果你愿意的话。