依赖注入 - 用于eclipse插件的Eclipse e4应用程序

时间:2014-11-24 23:11:26

标签: java eclipse dependency-injection eclipse-rcp

我是一个通过处理程序调用插件项目的e4应用程序。

public class CTGHandler{
    @Execute
    public void execute(final EPartService partService, final EModelService modelService){
        MPart mPart = modelService.createModelElement(MPart.class);
        mPart.setLabel("CTG"); //$NON-NLS-1$
        mPart.setContributionURI("bundleclass://plugin.project.ctg/test.project.ctg.CTG"); 
        partService.showPart(mPart, PartState.ACTIVATE);

    }

}

在插件方面

public class CTG{

    private final Composite parent;
    private Scale scale;

    @Inject
    public CTG(Composite parent){
        this.parent = parent;
    }

    @PostConstruct
    public void create(){
        scale = new Scale();
        Axis x = new Axis(scale);
        ....
    }
}

,Scale类如下所示

public class Scale{

    private int x;

    @Inject
    public Scale(){
        x = 10;
    }
}

问题:我将scale作为参数传递给Axis类Axis x = new Axis(scale);

问题:如何在scale对象上使用依赖注入,以便它可用于Axis类或插件项目中的任何其他类,而不将其作为变量传递给构造函数。我尝试在CTG.java和Axis.java中添加@Inject private Scale scale,但是Axis类没有得到比例值。

1 个答案:

答案 0 :(得分:3)

您可以将@Creatable注释添加到Scale类,以告知注入器在需要时创建新实例:

@Creatable
public class Scale
{
  ...
}

如果您只想要Scale添加@Singleton的单个实例:

@Creatable
@Singleton
public class Scale
{
  ...
}

您还可以使用OSGi服务创建单例类,或者将其注入AddOn或LifeCycle类中的上下文。

依赖注入通常仅在Eclipse创建的对象上完成。如果要对创建的对象进行注入,请使用ContextInjectionFactory创建对象:

@Inject
IEclipseContext context;

...

Axis x = ContextInjectionFactory.make(Axis.class, context);

make的替代版本可让您添加额外的值:

IEclipseContext staticContext = EclipseContextFactory.create();

staticContext.set(Scale.class, scale);

Axis x = ContextInjectionFactory.make(Axis.class, context, staticContext);