我正在寻找一种方法来为使用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
}
}
答案 0 :(得分: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