我正在寻找Udi Dahan的简单Java实现 域事件模式和基础结构,详见this article。
这很简单,我已经实现了自己的解释,但是我是一个Java新手,并且不想因为缺乏语言经验而被任何错误所困扰。
我发现的唯一Java实现是在Jdon Framework中,但对于我目前的项目来说,它实在太重了。
谢谢!
答案 0 :(得分:5)
我一直在寻找Java EE中同一问题的解决方案。我查看了Axon和jdon(页面并没有真正预示好:))。两者都涉及事件采购,我无法出售"给我的雇主/客户。我想拥有Domain Events,因为我非常习惯.NET / C#项目。所以我想出了以下内容......
我使用类似的静态DomainEvents对象来授予我访问发布机制的权限,而不会在我的域模型实体中泄漏实际的实现细节。所以这样的调用是这样的:
DomainEvents.fire(new MySampleEvent(...some params...));
CDI规范中提供的模式和机制是Events with @Observes,它允许您使用所有可用服务响应普通bean中的某些事件。这类似于我在使用像Castle Windsor这样的DI框架时所习惯的,我可以通过接口注册泛型处理程序。所以我已经让观察员(处理程序,听众,无论你想叫什么)都被覆盖了。例如:
@Stateless
public class MySampleEventObserver {
public void listen(@Observes MySampleEvent event) {
...
doSomethingWithEvent();
}
}
现在发布(在CDI中解雇)部分。由于没有办法在实体中访问CDI(有充分的理由!)我决定使用JNDI和BeanManager。我使用JNDI来获取BeanManager并使用它的fireEvent方法。将bean管理器解析为(seen here)代码:
public class BeanHelper {
public static BeanManager getBeanManager() {
try {
InitialContext initialContext = new InitialContext();
return (BeanManager) initialContext.lookup("java:comp/BeanManager");
} catch (NamingException e) {
e.printStackTrace();
return null;
}
}
}
最后一步是DomainEvents对象本身:
public class DomainEvents {
private static boolean mNopMode = false;
public static void setNopMode() {
mNopMode = true;
}
public static void reset() {
mNopMode = false;
}
public static <TDomainEvent> void fire(TDomainEvent event) {
if (mNopMode) {
return;
}
BeanManager manager = BeanHelper.getBeanManager();
manager.fireEvent(event);
}
}
当没有上下文时,setNopMode
和reset
部分用于测试目的。手动嘲笑基本上。在单元测试之前将其设置为NOP操作模式并在它们之后重置。
作为POC正常工作。但是,不知道它是否有任何严重的限制。我留下异步总线交互,类似于侦听器实现。
会喜欢任何评论。
答案 1 :(得分:1)
我目前正在使用谷歌Guava EventBus来做类似你所引用的“拯救”文章。
使用它类似于“如何引发域事件”看起来像这样,几乎与文章完全相同:
public class Customer
{
public void DoSomething()
{
MyEventBus.post(new CustomerBecamePreferred() { Customer = this });
}
}
我不知道您是否认为这是“Udi Dahan的域事件模式的实现”。
它不需要实现任何接口;事件处理程序标有注释,类在EventBus中注册MyEventBus.register(aListenerObject)