2011-08-29 21 views
8

Me encuentro con un problema de tipeo de base con mensajes que estoy tratando de publicar a través de MassTransit. Considere lo siguiente:Error de tipeo de mensaje masivo

[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; 

} 

Sin embargo, cuando intento publicar una colección de eventos abstractos con algo como:

public void PublishEvents(IEnumerable<Event> events) { 

    foreach (var e in events) { 

     Bus.Instance.Publish(e); 

    } 

} 

no recibo ningún evento de esta colección, independientemente de sus tipos concretos . Si selecciono el evento en su tipo concreto correcto antes de publicarlo en el autobús, recibo el mensaje correctamente.

¿Alguna idea sobre cómo puedo corregir esto para permitir que mi colección abstracta de Eventos se procese sin enviar cada uno?

EDIT: He intentado cambiar mi configuración para utilizar BinarySerialization así:

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

y no han producido ningún cambio en el comportamiento. La única forma en que he podido llamar a mi clase Consumes<PersonCreated> es lanzar explícitamente un evento al tipo PersonCreated.

Respuesta

10

Editar: El serializador no importa aquí. No pensé en esto.

Puede invocar Bus.Instance.Publish con la información de tipo correcta al reflexionar sobre el objeto Event y obtener su tipo real también. Este va a ser un código incómodo, pero una vez hecho, probablemente sea fácil de reutilizar. En Magnum tenemos un método de extensión para ayudar con esto.

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

unirse a nosotros en la lista de correo, http://groups.google.com/group/masstransit-discuss, y estaremos encantados de discutir con más detalle.

+0

Ahh .. He estado escaneando la lista de discusión para este problema hoy, y pensé que este era un gran lugar para publicar, ya que más lo verían aquí. Voy a cruzar la publicación –

+0

Nosotros, los desarrolladores de MT, veremos el correo electrónico antes de ver la publicación SO. Tratamos de ser muy receptivos a las preguntas. – Travis

+0

He actualizado mi pregunta para incluir información sobre mi intento de utilizar el BinarySerializer –