0
我们有一个RCP 3/4混合应用程序和一个在fragment.e4xmi中定义的处理程序。Eclipse RCP,何时创建了Handler?
<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application">
<elements xsi:type="commands:Handler" [..]/>
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/>
<elements xsi:type="commands:Handler" [..]/>
public class AddToDatabaseHandler implements EventHandler {
private ISelectionMSD selection;
public AddToDatabaseHandler() {
System.err.println("Created " + this);
}
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
System.err.println(this + ": Execute, selection is " + selection);
if(selection != null) {
// do something
}
}
@Override
public void handleEvent(Event event) {
if(event.getTopic().equals(UPDATE_SELECTION)) {
selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION);
System.err.println(this + ": Handle event, selection is " + selection);
}
}
}
我加了一些System.err的和我可以看到,该Handler的两个实例是通过DI /反射隐式地创建。
1)当创建该处理程序的实例时,是否有简单的解释?
2)首先创建的实例(在平台启动时)错过了该类正在侦听的事件。所以它似乎不会作为事件监听器添加到EventAdmin中。我能以某种方式调试吗?
3)它对我来说看起来像是“魔术”,第二类注册的时间和地点以及如何注册以听取事件?这是由平台完成的,还是我错过了我们自己的一些代码?
非常感谢您的帮助!
许多感谢的提示!我不知道如何或为什么,但使用注释方法事件在两个对象中都得到了正确处理。我仍然不知道为什么创建两个实例,但最重要的是现在它的一致性;) 对于“混合”,我的意思是我们有一个fragment.4xmi plus,我们使用plugin.xml和扩展点。 – kerner1000
有几个原因可能会多次创建一个处理程序,例如,如果您为每次创建零件时创建的零件定义了一个处理程序。 –
问题解决了。处理程序类也通过xml注册为OSGi服务(EventHandler),因此这两个实例。我使用建议的注释重构了它,并删除了OSGi服务定义,该定义与预期一致。非常感谢! – kerner1000