2011-08-29 5 views
8

MassTransit을 통해 게시하려고 시도하는 메시지에 기본 타이핑 문제가 있습니다. 에 관계없이 콘크리트 종류의, 나는이 컬렉션에서 어떤 이벤트를 수신하지 않습니다MassTransit 메시지가 잘못 입력되었습니다.

public void PublishEvents(IEnumerable<Event> events) { 

    foreach (var e in events) { 

     Bus.Instance.Publish(e); 

    } 

} 

: 내가 좋아하는 뭔가 추상적 이벤트의 컬렉션을 게시하려고 할 때, 그러나

[Serializable] 
public abstract class Event : CorrelatedBy<Guid> { 

    public Guid CorrelationId { get; set; } 

    public abstract string EventName { get; } 

    public override string ToString() { 
     return string.Format("{0} - {1}", EventName, CorrelationId); 
    } 

} 

[Serializable] 
public class PersonCreated : Event { 

    public PersonCreated(Guid personId, string firstName, string lastName) { 

     PersonId = personId; 
     FirstName = firstName; 
     LastName = lastName; 

    } 

    public readonly Guid PersonId; 
    public readonly string FirstName; 
    public readonly string LastName; 

} 

: 다음 사항을 고려 . 버스에 게시하기 전에 이벤트를 적절한 구체 유형으로 캐스팅하면 메시지가 올바르게 수신됩니다.

내 추상 이벤트 컬렉션이 각 이벤트를 캐스팅하지 않고 처리 할 수 ​​있도록이 문제를 해결할 수있는 방법에 대한 아이디어가 있습니까?

편집 : 내가 지금처럼 BinarySerialization를 이용할 수 있도록 설정을 변경 시도 :

Bus.Initialize(sbc => 
    { 
     sbc.UseBinarySerializer(); 
    }); 

과 행동의 변화를 굴복하지 않았습니다. 내 Consumes<PersonCreated> 클래스를 호출 할 수있는 유일한 방법은 이벤트를 명시 적으로 PersonCreated 유형으로 캐스팅하는 것입니다.

답변

10

편집 : 여기에서 시리얼 화기는 중요하지 않습니다. 나는 이것을 생각하지 않았다.

Event 개체에서 반사를 수행하고 실제 유형을 가져 와서 올바른 유형 정보로 Bus.Instance.Publish을 호출 할 수 있습니다. 이것은 다소 어색한 코드 일 것입니다.하지만 한번 재사용하기가 쉽습니다. 매그넘에는이 문제를 해결하는 확장 방법이 있습니다.

Bus.Instance.FastInvoke(new[]{ event.GetType() }, "Publish", event); 

은 메일 링리스트, http://groups.google.com/group/masstransit-discuss에 우리와 함께, 우리는 더 세부 사항을 논의 할 수있을 것입니다.

+0

아 .. 저는 오늘이 문제에 대한 토론 목록을 조사해 왔으며, 더 많은 사람들이 여기에서 볼 수 있듯이 이것이 게시하기 좋은 곳이라고 생각했습니다. 나는 교차 게시 할 예정이다. –

+0

우리 MT 개발자는 우리가 SO 게시글을보기 전에 이메일을 볼 것이다. 우리는 질문에 매우 민감하게 반응하려고 노력합니다. – Travis

+0

BinarySerializer 사용 시도에 대한 정보를 포함하도록 내 질문을 업데이트했습니다. –

관련 문제