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