在我的公司,我们习惯于构建与命令行工具共享接口的Eclipse插件。我们正在研究将Eclipse 4 RCP API用于我们的下一个插件,但是我在自己的对象上使用注入时遇到了麻烦。例如,我想声明IHelper必须由EclipseHelper实例化:
interface IHelper { /* In core plugin (not Eclipse dependent) */
...
}
class EclipseHelper implements IHelper { /* In Eclipse plugin */
@Inject
EclipseHelper(IWorkbench workbench) { ... }
}
使用guice,我会在Injector中声明从IHelper到EclipseHelper的绑定,但是在Eclipse中我只找到片段(如vogella),将IHelper绑定到EclipseHelper的具体实例。我不想这样做,构造实例可能是任意复杂的。如何在应用程序级别声明绑定?
如果你在OSGi环境中使用Eclipse DI(并且因为你试图注入IWorkbench
我假设你是),你可以使用ContextFunction
来生成一个实例,如果它在IEclipseContext中不可用的话。
这将把ContextFunction放在OSGi服务层中:
@Component(service = IContextFunction.class, property = "service.context.key=my.domain.IHelper")
public class IHelperFactoryCF extends ContextFunction {
@Override
public Object compute(IEclipseContext context) {
return ContextInjectionFactory.make(EclipseHelper.class, context);
}
}
你也可以把ContextFunction
放在DI-Context中。有关更多信息,请参见此处:https://wiki.eclipse.org/Eclipse4/RCP/Contexts#Context_Functions