2011-08-29 32 views
8

MassTransit aracılığıyla yayınlamaya çalıştığım iletilerle temel yazım sorunuyla karşılaşıyorum. bakılmaksızın beton türlerinden, bu koleksiyonun dışında herhangi olayları almak OLMAYANMassTransit iletisi yanlış yazıyor

public void PublishEvents(IEnumerable<Event> events) { 

    foreach (var e in events) { 

     Bus.Instance.Publish(e); 

    } 

} 

: Ben böyle bir şeyle soyut olayların bir koleksiyon yayınlamak istediğinizde, Ancak

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

} 

: Aşağıdaki düşünün . Etkinliği otobüste yayınlamadan önce uygun beton türüne gönderirseniz, mesajı doğru şekilde alırım.

Soyut koleksiyonumun her birini oluşturmadan işlenmesini sağlamak için bunu nasıl düzeltebileceğime dair herhangi bir fikir var mı?

DÜZENLEME: Ben şöyle BinarySerialization kullanmak benim ayarlarını değiştirmek için çalıştılar:

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

ve herhangi bir davranış değişikliği verime sahip değildir. Consumes<PersonCreated> sınıfımı aramam için kullanabileceğim tek yol, bir olayı açıkça PersonCreated türüne yayınlamaktır.

cevap

10

Düzenleme: Serializer burada önemli değil. Bunu düşünmemiştim.

Event nesnesinde yansıma yaparak ve gerçek türünü elde ederek Bus.Instance.Publish doğru tür bilgileriyle çağırabilirsiniz. Bu biraz garip bir kod olacak ama bir kez daha yeniden kullanımı kolay hale geldiğinde. Magnum'da buna yardımcı olacak bir uzantı yöntemimiz var.

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

posta listesinde, http://groups.google.com/group/masstransit-discuss bize katılın ve biz daha ayrıntılı olarak ele almaktan memnuniyet duyarız.

+0

Ahh .. Bu sorunun tartışma listesini bugün tarıyordum ve bunun burada görebileceği gibi, yayınlamak için harika bir yer olduğunu düşündüm. Ben –

+0

çapraz göndereceğiz Biz, MT geliştiriciler, SO post görmeden önce e-postayı göreceğiz. Sorulara oldukça duyarlı olmaya çalışıyoruz. – Travis

+0

Sorunu, BinarySerializer –