Java中的域事件模式实现?

Hol*_*osa 7 java design-patterns domain-driven-design domain-events

我正在寻找Udi Dahan的域事件模式和基础结构的简单Java实现,如本文所述.

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

我发现的唯一Java实现是在Jdon Framework中,但它对我目前的项目来说有点过于重要.

谢谢!

jl.*_*jl. 5

我一直在寻找Java EE中同一问题的解决方案.我看了Axonjdon(该页面并不是真的好兆头:)).两者都涉及事件采购,我不能"卖"给我的雇主/客户.我想拥有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)

}

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

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

会喜欢任何评论.


Ste*_*n P 1

我目前正在考虑使用 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)