Udi Dahan의 도메인 이벤트 패턴 및 인프라에 대한 간단한 Java 구현을 this article으로 검색하고 있습니다.Java의 도메인 이벤트 패턴 구현?
아주 간단하고 내 자신의 해석을 구현했습니다. 그러나 나는 자바 초보자이며 언어에 대한 경험이 없기 때문에 실수로 인해 물릴 싶지 않습니다.
내가 발견 한 유일한 Java 구현은 Jdon Framework이지만 내 프로젝트의 현재 상태는 약간 지나치게 비쌉니다.
감사합니다.
Udi Dahan의 도메인 이벤트 패턴 및 인프라에 대한 간단한 Java 구현을 this article으로 검색하고 있습니다.Java의 도메인 이벤트 패턴 구현?
아주 간단하고 내 자신의 해석을 구현했습니다. 그러나 나는 자바 초보자이며 언어에 대한 경험이 없기 때문에 실수로 인해 물릴 싶지 않습니다.
내가 발견 한 유일한 Java 구현은 Jdon Framework이지만 내 프로젝트의 현재 상태는 약간 지나치게 비쌉니다.
감사합니다.
저는 현재 Google의 Guava EventBus을 사용하여 당신이 참조하는 "구원"기사와 비슷한 것을하려고합니다. 나는 당신이 생각 하는데요 여부를 모르는
public class Customer
{
public void DoSomething()
{
MyEventBus.post(new CustomerBecamePreferred() { Customer = this });
}
}
: 기사와 거의 동일한과 같이 "도메인 이벤트를 발생하는 방법"을 보면 무언가에 그와 유사한 사용
"Udi Dahan의 도메인 이벤트 패턴 구현"으로
인터페이스를 구현할 필요가 없습니다. 이벤트 핸들러에 주석이 표시되고 클래스가 EventBus에 등록되었습니다. MyEventBus.register(aListenerObject)
잠시 동안 Java EE에서 같은 문제에 대한 해결책을 찾고있었습니다. 나는 Axon과 jdon을 보았다. (그 페이지는별로 좋지 않았다. :)). 두 가지 모두 제가 이벤트/소싱 (Event Sourcing)을 포함하고있어서 고용주/고객에게 "팔지"못했습니다. 나는 .NET/C# 프로젝트에서 익숙해 졌기 때문에 도메인 이벤트를 원했습니다. 그래서 다음을 생각해 냈습니다.
도메인 모델 엔터티 전체에 실제 구현 세부 정보가 누출되지 않고 게시 메커니즘에 대한 액세스 권한을 부여하기 위해 유사한 정적 DomainEvents 개체를 사용했습니다. 따라서이 같은 통화 뭔가 :
DomainEvents.fire(new MySampleEvent(...some params...));
CDI 사양에서 사용할 수있는 패턴과 메커니즘은 당신이 사용할 수있는 모든 서비스를 일반 콩에 특정 이벤트에 응답 허용 Events with @Observes입니다. 이는 Castle Windsor과 같은 DI 프레임 워크를 사용할 때 익숙했던 것과 비슷합니다. 인터페이스에서 일반 핸들러를 등록 할 수 있습니다. 그래서 관찰자 (처리기, 청취자, 당신이 그들에게 전화하기를 원하는 것)가 있습니다. 예 :
이제 (CDI 발사) 부분에 대해. 엔티티에서 CDI에 액세스 할 수있는 방법이 없기 때문에 (좋은 이유!) JNDI와 BeanManager을 사용하기로 결심했습니다. 나는 JNDI를 사용하여 BeanManager를 얻고 그것을 fireEvent 메소드로 사용했다.코드 (seen here으로) 해결 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;
}
}
}
는 마지막 단계 인 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로 잘 작동합니다. 비록 그것의 사용에 어떤 심각한 제한이 있는지 모르겠다. 비동기 버스 상호 작용을 유지하고 리스너 구현과 유사합니다.
의견이 있으십니까?
스티븐 감사합니다. 정말 멋진 데요. 구아바에 대해 몰랐습니다. 내 영역을 구현 세부 사항에 대해 무지하게 유지하려고 노력하지만, Guava EventBus에 대해 약간의 생각을 할애 할 것입니다. 아마도 내 도메인에서 구현을 숨기기 위해 EventBus를 래핑 할 수 있습니다 ... – HolySamosa
예 @HolySamosa - 그것을 넣을 때 포장 하겠지만 단순한'register()'와'post()'인터페이스를 그것. –
도메인 모델에 구아바 구독 어노테이션을 보관한다고 가정합니까? 바인딩 구독에 주석을 사용하는 아이디어가 마음에 들지만, 그런 구현 세부 사항을 내 멋진 도메인 모델에 적용하지 않을 것입니다. – HolySamosa