2014-04-30 22 views
1

在我的系統我有2分的情況:如何用CDI Events實現觀察者模式?

  1. 組分X產生被用Y觀察到的事件
  2. 組分X產生應由部件的F.F被觀測到的事件決定是否事件應該被忽略或修改並將其傳遞到Y

是否有可能與CDI事件來實現呢?

回答

1

CDI只供應商能力的廣播風格/主題活動。 CDI中沒有事件過濾。

我能想到做等價的唯一辦法就是拿出一個限定詞。也許F可以@Observes @A @B SomeObjectY可以@Observes @C @B SomeObject。當F獲得一個事件時,它可以使用@C @B作爲限定符來重新使用它。

+0

這是很好的解決方案,但是當我們意識到只有一個場景它的工作原理。我想實現這兩個並啓用一個配置。 – Karol

+0

配置完全取決於您。 –

0

我會嘗試建立某種形式的事件生產者和事件消費者之間的代理:

class EventProducer{ 
    @Inject private Event<EventObject> event; 

    public void produce(){ 
     event.fire(new EventObject()); 
    } 
} 

代理:

class EventsProxy{ 

    @Inject private Event<EventObjectForY> event_1; 
    @Inject private Event<EventObjectForF> event_2; 

    void observe(@Observes EventObject){ 
     if(eventObjectEligibleForF()){ 
      EventObjectForF f = copyEventObjectToEventObjectForF(); 
      event_2.fire(f); 
     } 
     EventObjectForY y = copyEventObjectToEventObjectForY(); 
     event_2.fire(y); 
    } 
} 

消費者:

class EventConsumer{ 
    public consume(@Observes EventObjectForY obj){ 
    } 
} 

但請記住,這只是僞代碼。