Java中的域事件模式实现?

时间:2012-04-18 20:00:36

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

我正在寻找Udi Dahan的简单Java实现 域事件模式和基础结构,详见this article

这很简单,我已经实现了自己的解释,但是我是一个Java新手,并且不想因为缺乏语言经验而被任何错误所困扰。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

我一直在寻找Java EE中同一问题的解决方案。我查看了Axonjdon(页面并没有真正预示好:))。两者都涉及事件采购,我无法出售"给我的雇主/客户。我想拥有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);
  }

}

当没有上下文时,setNopModereset部分用于测试目的。手动嘲笑基本上。在单元测试之前将其设置为NOP操作模式并在它们之后重置。

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

会喜欢任何评论。

答案 1 :(得分:1)

我目前正在使用谷歌Guava EventBus来做类似你所引用的“拯救”文章。

使用它类似于“如何引发域事件”看起来像这样,几乎与文章完全相同:

public class Customer
{
    public void DoSomething()
    {
        MyEventBus.post(new CustomerBecamePreferred() { Customer = this });
    }
}

我不知道您是否认为这是“Udi Dahan的域事件模式的实现”。

它不需要实现任何接口;事件处理程序标有注释,类在EventBus中注册MyEventBus.register(aListenerObject)