Hol*_*osa 7 java design-patterns domain-driven-design domain-events
我正在寻找Udi Dahan的域事件模式和基础结构的简单Java实现,如本文所述.
这很简单,我已经实现了自己的解释,但是我是一个Java新手,并且不想因为缺乏语言经验而被任何错误所困扰.
我发现的唯一Java实现是在Jdon Framework中,但它对我目前的项目来说有点过于重要.
谢谢!
我一直在寻找Java EE中同一问题的解决方案.我看了Axon和jdon(该页面并不是真的好兆头:)).两者都涉及事件采购,我不能"卖"给我的雇主/客户.我想拥有Domain Events,因为我非常习惯.NET/C#项目.所以我想出了以下......
我使用类似的静态DomainEvents对象来授予我访问发布机制的权限,而不会在我的域模型实体中泄漏实际的实现细节.所以这样的调用是这样的:
DomainEvents.fire(new MySampleEvent(...some params...));
Run Code Online (Sandbox Code Playgroud)
CDI规范中提供的模式和机制是具有@Observes的事件,它允许您使用所有可用服务响应普通bean中的某些事件.这类似于我在使用像Castle Windsor这样的DI框架时所习惯的,我可以通过接口注册通用处理程序.所以我有观察员(处理程序,听众,无论你想叫什么)都被覆盖了.例:
@Stateless
public class MySampleEventObserver {
public void listen(@Observes MySampleEvent event) {
...
doSomethingWithEvent();
}
}
Run Code Online (Sandbox Code Playgroud)
现在发布(在CDI中发布)部分.由于没有办法在实体中访问CDI(有充分的理由!)我决定使用JNDI和BeanManager.我使用JNDI获取BeanManager并使用它的fireEvent方法.将bean管理器解析(如此处所示)在代码中:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
最后一步是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);
}
Run Code Online (Sandbox Code Playgroud)
}
当没有上下文时,这些setNopMode和reset部分用于测试目的.手动嘲笑基本上.在单元测试之前将其设置为NOP操作模式并在它们之后重置.
作为POC工作正常.不知道它的使用是否有任何严重的限制.我留下异步总线交互和类似于侦听器实现.
会喜欢任何评论.
我目前正在考虑使用 Google 的Guava EventBus来执行类似于您引用的“救赎”文章的操作。
使用类似于“如何引发域事件”的方式看起来像这样,几乎与文章完全相同:
public class Customer
{
public void DoSomething()
{
MyEventBus.post(new CustomerBecamePreferred() { Customer = this });
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道您是否会认为这是“Udi Dahan 领域事件模式的实现”。
它不需要实现任何接口;事件处理程序用注释标记,并且该类通过 EventBus 注册MyEventBus.register(aListenerObject)