2011-08-29 13 views
8

Si è verificato un problema di battitura di base con i messaggi che sto tentando di pubblicare tramite MassTransit. Si consideri il seguente:Errore di digitazione dei messaggi di MassTransit

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

} 

Tuttavia, quando tento di pubblicare una raccolta di eventi astratti con qualcosa di simile:

public void PublishEvents(IEnumerable<Event> events) { 

    foreach (var e in events) { 

     Bus.Instance.Publish(e); 

    } 

} 

non ricevo tutti gli eventi di questa collezione, a prescindere dalle loro tipi concreti . Se lancio l'evento sul proprio tipo concreto prima della pubblicazione sul bus, ricevo correttamente il messaggio.

Qualche idea su come posso correggere questo per consentire alla mia raccolta astratta di eventi di essere elaborata senza eseguire il casting di ciascuno di essi?

EDIT: Ho tentato di cambiare le mie impostazioni per utilizzare BinarySerialization in questo modo:

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

e non hanno prodotto alcun cambiamento nel comportamento. L'unico modo in cui sono riuscito a chiamare la classe Consumes<PersonCreated> consiste nel trasmettere esplicitamente un evento al tipo PersonCreated.

risposta

10

Modifica: il serializzatore non importa qui. Non ci ho pensato.

È possibile richiamare Bus.Instance.Publish con le informazioni sul tipo corretto effettuando la riflessione sull'oggetto Event e ottenendo anche il suo tipo effettivo. Questo sarà un codice imbarazzante, ma una volta fatto è facile riutilizzarlo. In Magnum abbiamo un metodo di estensione per aiutare con questo.

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

Unisciti a noi su mailing list, http://groups.google.com/group/masstransit-discuss, e saremo lieti di discutere più in dettaglio.

+0

Ahh .. Ho esaminato l'elenco di discussione per questo problema oggi, e ho pensato che fosse un posto fantastico per postare, come più lo vedrei qui. Effettuerò il cross-post –

+0

Noi, gli sviluppatori MT, vedremo l'e-mail prima che vedremo post SO. Cerchiamo di essere abbastanza reattivi alle domande. – Travis

+0

Ho aggiornato la mia domanda per includere informazioni sul mio tentativo di utilizzare il BinarySerializer –

Problemi correlati