我正在寻找一个简单的Java实现Udi Dahan领域事件模式和基础设施,如this article所述。
这很简单,我已经实现了自己的解释,但我是一个Java新手,不想因为对语言的经验不足而犯错误。
我发现的唯一的Java实现是在Jdon Framework中,但在我的项目中有点过于复杂。
谢谢!
这很简单,我已经实现了自己的解释,但我是一个Java新手,不想因为对语言的经验不足而犯错误。
我发现的唯一的Java实现是在Jdon Framework中,但在我的项目中有点过于复杂。
谢谢!
我已经在Java EE中寻找解决同样问题的方法有一段时间了。我看了Axon和jdon(该页面实际上并不好 :))。两者都涉及事件溯源,这是我无法向我的雇主/客户“推销”的。虽然我非常习惯.NET/C#项目中的领域事件,但我仍然希望拥有领域事件。因此,我想到了以下解决方案...
我使用了类似的静态DomainEvents对象,以便为我提供访问发布机制的方式,而不会使实际实现细节泄漏到我的领域模型实体中。因此,调用类似这样的内容:
DomainEvents.fire(new MySampleEvent(...some params...));
@Stateless
public class MySampleEventObserver {
public void listen(@Observes MySampleEvent event) {
...
doSomethingWithEvent();
}
}
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运行良好。不知道它的使用是否有任何严重限制。我将异步总线交互和类似的事情留给侦听器实现。
希望得到任何评论。
目前我正在考虑使用Google的Guava EventBus来实现类似于您参考文章中所提到的"救赎"的功能。
如果要使用类似于“如何引发领域事件”的方式来使用它,那么代码将会非常相似,几乎与该篇文章完全一致:
public class Customer
{
public void DoSomething()
{
MyEventBus.post(new CustomerBecamePreferred() { Customer = this });
}
}
我不知道你是否认为这是“Udi Dahan的领域事件模式”的实现。
它不需要实现任何接口;事件处理程序使用注释标记,并使用MyEventBus.register(aListenerObject)
在EventBus中注册类。
register()
和post()
接口。 - Stephen P