java - Java 中的域事件模式实现?

标签 java design-patterns domain-driven-design domain-events

我正在寻找 Udi Dahan 的简单 Java 实现 this article 中详述的领域事件模式和基础设施.

这很简单,我已经实现了我自己的解释,但是我是一个 Java 新手,不想因为对这门语言没有经验而被任何错误咬伤。

我发现的唯一 Java 实现是在 Jdon Framework 中,但对于我当前的项目来说,它有点太重量级了。

谢谢!

最佳答案

一段时间以来,我一直在寻找 Java EE 中相同问题的解决方案。我看了Axonjdon (该页面也不是什么好兆头 :))。两者都涉及我无法“出售”给我的雇主/客户的事件溯源。不过,我想拥有域事件,因为我在 .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);
  }

setNopModereset 部分用于在没有上下文时进行测试。基本上是手动模拟。在单元测试之前将其设置为 NOP 操作模式,并在单元测试之后重置。

作为 POC 工作正常。不知道它的使用是否有任何严重的限制。我留下了异步总线交互和类似于监听器的实现。

欢迎任何评论。

关于java - Java 中的域事件模式实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217065/

相关文章:

java - 如何在java中从sys.tables获取表名?

c#属性问题

c# - 您如何平衡框架/API 设计和 TDD

go - 在 DDD 中,一个实体和存储库可以从多个表中提取吗?

Java电子邮件内容为空

java - 转义单个反斜杠\两个

domain-driven-design - 为什么传奇(又名流程管理器)包含内部状态,为什么它们会持久化到事件存储中?

java - session 和邀请/如何在 DDD 上下文中建模邀请机制?

java - unique(true) - 无法准备语句

OOP 设计问题