9

我创建了一个带有声明式服务的 OSGI 服务来注入一个实现接口的对象。如果我将对象注入到附加到应用程序模型(处理程序、部件、....)的类中,它工作正常。如果我将它注入一个未附加到应用程序模型的类中,它总是返回 null。

是否可以在未附加到应用程序模型的类中使用 DI?我查看了vogella教程,但不知何故我找不到解决方案。

4

2 回答 2

6

我知道 Eclipse 4 如何在您的类中注入对象的三种方式:

  1. 在启动期间,Eclipse 运行时在它实例化的类中寻找相关的注释。
  2. 在 1. 中注入的对象会被跟踪,如果发生更改将被重新注入。
  3. 使用 ContextInjectionFactory 和 IEclipseContext 手动触发注入。

第三种选择可能会实现您想要的。是一个代码示例:

    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(..) 一样。

于 2012-12-25T01:22:59.683 回答
0

为了实现这一点,我重构了 e(fx)clipse 的某些部分。看看这个。对不起无耻的插件...

于 2015-01-08T17:13:26.130 回答