我创建了一个带有声明式服务的 OSGI 服务来注入一个实现接口的对象。如果我将对象注入到附加到应用程序模型(处理程序、部件、....)的类中,它工作正常。如果我将它注入一个未附加到应用程序模型的类中,它总是返回 null。
是否可以在未附加到应用程序模型的类中使用 DI?我查看了vogella教程,但不知何故我找不到解决方案。
我创建了一个带有声明式服务的 OSGI 服务来注入一个实现接口的对象。如果我将对象注入到附加到应用程序模型(处理程序、部件、....)的类中,它工作正常。如果我将它注入一个未附加到应用程序模型的类中,它总是返回 null。
是否可以在未附加到应用程序模型的类中使用 DI?我查看了vogella教程,但不知何故我找不到解决方案。
我知道 Eclipse 4 如何在您的类中注入对象的三种方式:
第三种选择可能会实现您想要的。这是一个代码示例:
ManipulateModelhandler man = new ManipulateModelhandler();
//inject the context into an object
//IEclipseContext iEclipseContext was injected into this class
ContextInjectionFactory.inject(man,iEclipseContext);
man.execute();
然而,问题是;IEclipseContext 已经需要注入到可以访问需要注入的对象的类中。根据必要注入的数量,使用委托可能更有用(可测试性将是一个论点)。
@Inject
public void setFoo(Foo foo) {
//Bar is not attached to the e4 Application Model
bar.setFoo(foo);
}
因此,更好的解决方案可能是使用@Creatable注释。简单地注释你的类,并给它一个无参数的构造函数。
@Creatable
public class Foo {
public Foo () {}
}
如上述方法在该类型上使用@Inject,将使Eclipse 实例化并注入它。缺点是您无法再控制对象的创建,就像使用 ContextInjectionFactory.inject(..) 一样。
为了实现这一点,我重构了 e(fx)clipse 的某些部分。看看这个。对不起无耻的插件...