1

我正在寻找一种将某种参数添加到使用 CDI 事件机制传播的事件的方法。

我知道对于我的示例,我可以创建不同的事件,但我正在寻找一种方法来重用相同的事件,但使用不同的参数。然后使用此事件参数注释一些方法,以便在触发事件时仅调用此方法。

以下示例不起作用,但说明了我的意图。这有可能吗?

//custom event class
public class NotifyChange {

}

//change the model and notify the view
public class MyPresenter {
    @Inject
    private Events<NotifyChange> events;

    public void updateUser() {
        //change some user settings
        events.fire(new NotifyChange("user")); //that what I'm somehow looking for
    }

    public void updateCustomer() {
        //change some customer settings
        events.fire(new NotifyChange("customer"));
    }
}

//change the view according to events
public class MyView {
    void listenUserChange(@Observes NotifyChange("user") evt) {
        //update UI
    }

    void listenCustomerChange(@Observes NotifyChange("customer") evt) {
        //update UI
    }
}
4

1 回答 1

4

如果您想避免为每个事件创建类和注释,我想最好的方法是使用限定符参数。这是您的代码的样子:

//MyPresenter.class
@Inject @ChangeType(Role.USER)
private Event<NotifyChange> userEvent;

@Inject @ChangeType(Role.CUSTOMER)
private Event<NotifyChange> custumerEvent;

public void updateUser() {
    userEvent.fire(new NotifyChange());
}

public void updateCustomer() {
    custumerEvent.fire(new NotifyChange());
}


//MyView.class
public void listenUserChange(
        @Observes @ChangeType(Role.USER) NotifyChange evt) {
}

void listenCustomerChange(
        @Observes @ChangeType(Role.CUSTOMER) NotifyChange evt) {
}

//Role.class
public enum Role {
USER, CUSTOMER
}

//ChangeType 
@Qualifier
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
    public @interface ChangeType {

    Role value();
}

更多文档:http ://docs.jboss.org/weld/reference/1.1.5.Final/en-US/html_single/#d0e4018

于 2013-09-30T18:21:24.700 回答