2016-12-19 38 views
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)它对我来说看起来像是“魔术”,第二类注册的时间和地点以及如何注册以听取事件?这是由平台完成的,还是我错过了我们自己的一些代码?

非常感谢您的帮助!

回答

2

我不确定3/4混合应用程序的含义。

e4处理程序仅执行@Execute(和@CanExecute)方法,因此不期望执行EventHandler并且没有内容会查找此内容或调用方法。

如果你想处理事件使用@EventTopic@UIEventTopic

@Inject 
@Optional 
public void handleEvent(@EventTopic("topic id") Event event) 
+0

许多感谢的提示!我不知道如何或为什么,但使用注释方法事件在两个对象中都得到了正确处理。我仍然不知道为什么创建两个实例,但最重要的是现在它的一致性;) 对于“混合”,我的意思是我们有一个fragment.4xmi plus,我们使用plugin.xml和扩展点。 – kerner1000

+0

有几个原因可能会多次创建一个处理程序,例如,如果您为每次创建零件时创建的零件定义了一个处理程序。 –

+0

问题解决了。处理程序类也通过xml注册为OSGi服务(EventHandler),因此这两个实例。我使用建议的注释重构了它,并删除了OSGi服务定义,该定义与预期一致。非常感谢! – kerner1000