2017-02-13 10 views
1

제 처리기가 내 이벤트를 "잡는"데 문제가 있습니다. 현재의 구조는 Rebus 주변의 래퍼를 Rebus의 메소드를 감싸는 별도의 패키지에두고, Autofac과 함께 사용할 수있는 팩터를 노출한다는 것입니다.Rebus : 제네릭을 사용하여 이벤트 유형을 처리하는 방법

그런 다음 도메인 이벤트가 모두 별도의 패키지와 네임 스페이스에 있으므로 Rebus에 대해 알지 못합니다. 반대의 경우도 마찬가지입니다. 그는 모두 IDistributedEvent 유형에서 파생되며 추상 유형 DistributedEvent을 구현합니다.

내가 이벤트를 게시 할 때 MessageSent, 나는 다음 내 래퍼에 나는 Payload 속성으로 도메인 이벤트를 설정 봉투 이벤트 BusEvent 할 말 :

이유가 할 수
public Task Publish<T>(T payload, TimeSpan expiration) where T : IDistributedEvent 
{ 
    var message = new BusEvent<T> { Payload = payload }; 
    return InternalBus.Publish(message, new Dictionary<string, string> { 
     { Headers.TimeToBeReceived, expiration.ToString() }, 
     { "pd-version", payload.EventVersion.ToString() }, 
    }); 
} 

입니다 시간이 지남에 따라 메타 데이터를 추가하십시오 (그러나 이것은 잘못된 방법입니다).

어쨌든, 내 문제는 내 핸들러가 더 나는 인터페이스를 사용하여 처리기를 만들더라도, 유형 BusEvent<MessageSent>을 처리 할 수있는 핸들러로 인식되는 지금입니다 IHandleMessages<BusEvent<T>> where T : IDistributedEvent

그래서 질문은 : 여기 잘못하고 있는가 , 또는이 단순히 그것을하는 나쁜 방법입니다. 따라서 필자는 엔벌 로프 형식을 제거하고 도메인 이벤트 유형을 직접 처리해야합니까?

답변

0

내가 너라면, 봉투의 일을 피할 것입니다. Rebus는 메시지를 보낼 때 헤더에 메시지를 첨부 할 수있는 메커니즘을 이미 갖추고 있으므로 원하는 경우 이미 사용자 지정 항목을 추가 할 수 있습니다.

과정의 제한은 추가 데이터가 string로서 표현할 수 있어야한다는 것입니다 - string 키 - 값 쌍,하지만 다시 : JSON 문자열, 그래서 무엇이든 가능)

내가 볼 수 없습니다 어떤 이유로 든 수제 일반 봉투에서 작동하지 않아야하는 이유가 있습니다. 처리 된 메시지가 YourMessage 일 때 처리기가 올바른 IHandleMessages<BusEvent<YourMessage>>으로 등록 된 경우 정상적으로 작동합니다.

polymorphic 디스패치가 IHandleMessages<BusEvent<T>> where T : IDistributedEvent을 구현하는 제네릭 처리기와 함께 작동하기를 기대하기 때문입니까? 다음은 작동하지 않습니다 때문에, 유형 BusEvent<MessageSent>의 메시지를 수신하는 Autofac에서 다음 핸들러를 찾는 초래하기 때문에 :

IHandleMessages<BusEvent<MessageSent>> 
IHandleMessages<object> 

을 그게 BusEvent<>로 시작하는 상속 체인을 검색 할 때 수수께끼가 발견 무엇 때문에, 하지만 분명 그게 내가`BusEvent` 도랑하기로 결정

IHandleMessages<BusEvent<DistributedEvent>> 

또는

IHandleMessages<BusEvent<IDistributedEvent>> 
+0

포함되지 않습니다 그것은 분명히 간단하게 . 그러나, 나는 여전히 polymorphic 파견을 작동시키지 않을 수 있습니다. IDistributedEvent에 가입 한 버스 인스턴스에서 IHandleMessages 를 구현하는 핸들러가 있습니다. – Hulvej

+0

핸들러 유형이 컨테이너에 등록되어 IHandleMessages 를 확인할 때 반환되는 방식입니까? – mookid8000

+0

또 다른 사항 :'SomeEvent' 또는 구체적인 유형이 무엇이든간에 구독해야합니다. Rebus가 메시지를 게시 할 때 메시지 유형에서 주제를 유추합니다. 메시지 유형은 기본적으로 (단순한) 어셈블리 규정 유형 이름입니다. 'MyMessages와 같은 것.SomeEvent, MyMessages' – mookid8000