Неправильный набор сообщений MassTransit - PullRequest
8 голосов
/ 30 августа 2011

У меня проблема с типизацией базы сообщений, которые я пытаюсь опубликовать через 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;

}

Однако, когда я пытаюсь опубликовать коллекцию абстрактных событий с чем-то вроде:

public void PublishEvents(IEnumerable<Event> events) {

    foreach (var e in events) {

        Bus.Instance.Publish(e);

    }

}

Я НЕ получаю никаких событий из этой коллекции, независимо от их конкретных типов. Если я приведу событие к соответствующему конкретному типу перед публикацией на шине, я получу сообщение правильно.

Есть какие-нибудь идеи относительно того, как я могу исправить это, чтобы моя абстрактная коллекция Событий могла быть обработана без приведения каждого из них?

РЕДАКТИРОВАТЬ: Я попытался изменить свои настройки для использования BinarySerialization, например, так:

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

и не привели к каким-либо изменениям в поведении. Единственный способ получить класс Consumes<PersonCreated> для вызова - это явное приведение события к типу PersonCreated.

1 Ответ

10 голосов
/ 30 августа 2011

Редактировать: Сериализатор здесь не имеет значения. Я не думал об этом.

Вы можете вызвать Bus.Instance.Publish с правильной информацией о типе, отразив объект Event и получив его фактический тип. Это будет какой-то неуклюжий код, но как только он будет сделан, его, вероятно, будет легко использовать повторно. В Magnum у нас есть метод расширения, чтобы помочь с этим.

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

Присоединяйтесь к нам в списке рассылки, http://groups.google.com/group/masstransit-discuss,, и мы будем рады обсудить более подробно.

...