我正在寻找 Udi Dahan 的简单 Java 实现 this article 中详述的领域事件模式和基础设施.
这很简单,我已经实现了我自己的解释,但是我是一个 Java 新手,不想因为对这门语言没有经验而被任何错误咬伤。
我发现的唯一 Java 实现是在 Jdon Framework 中,但对于我当前的项目来说,它有点太重量级了。
谢谢!
最佳答案
一段时间以来,我一直在寻找 Java EE 中相同问题的解决方案。我看了Axon和 jdon (该页面也不是什么好兆头 :))。两者都涉及我无法“出售”给我的雇主/客户的事件溯源。不过,我想拥有域事件,因为我在 .NET/C# 项目中非常习惯它们。所以我想出了以下...
我使用了一个类似的静态 DomainEvents 对象来访问发布机制,而不会在整个域模型实体中泄漏实际的实现细节。所以调用是这样的:
DomainEvents.fire(new MySampleEvent(...some params...));
CDI 规范中可用的模式和机制是 Events with @Observes允许您使用所有可用服务响应普通 bean 中的某些事件。这类似于我在使用像 Castle Windsor 这样的 DI 框架时所习惯的。我可以在其中通过接口(interface)注册通用处理程序。所以我已经涵盖了观察者(处理者、听众,无论你怎么称呼他们)。示例:
@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 工作正常。不知道它的使用是否有任何严重的限制。我留下了异步总线交互和类似于监听器的实现。
欢迎任何评论。
关于java - Java 中的域事件模式实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217065/