使用 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 做什么:
注册 IInterface 的所有实现,以便能够将它们解析为列表:
public class MyTest {
public MyTest(IInterface[] list){}
}
另一个选项是能够使用命名键注册实现:
container.addComponent(IInterface.class, MyClass1.class, "name1");
container.addComponent(IInterface.class, MyClass2.class, "name2");
能够做类似的事情:
container.getComponent(IInterface.class, "name2");
是否有至少第一个问题的内置解决方案?
UPD
- 发现 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(接近您的期望)。或者使用一些我可以详细解释的自定义方法,如果你愿意的话。
我有接口
public interface IInterface{}
我有这个接口的实现列表:
public class MyClass1 implements IInterface{}
public class MyClass2 implements IInterface{}
我想用 Pico Container 做什么:
注册 IInterface 的所有实现,以便能够将它们解析为列表:
public class MyTest { public MyTest(IInterface[] list){} }
另一个选项是能够使用命名键注册实现:
container.addComponent(IInterface.class, MyClass1.class, "name1"); container.addComponent(IInterface.class, MyClass2.class, "name2");
能够做类似的事情:
container.getComponent(IInterface.class, "name2");
是否有至少第一个问题的内置解决方案?
UPD
- 发现 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(接近您的期望)。或者使用一些我可以详细解释的自定义方法,如果你愿意的话。