Jef*_*itz 8 c# masstransit event-handling
我正在尝试通过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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用以下内容发布抽象事件的集合时:
public void PublishEvents(IEnumerable<Event> events) {
foreach (var e in events) {
Bus.Instance.Publish(e);
}
}
Run Code Online (Sandbox Code Playgroud)
无论具体类型如何,我都不会收到此系列中的任何活动.如果我在公共汽车上发布之前将事件转换为适当的具体类型,我确实会收到正确的消息.
关于我如何纠正这个问题的任何想法,以便我可以处理我的抽象事件集合,而不必每次都抛出它们?
编辑: 我试图更改我的设置以使用BinarySerialization,如下所示:
Bus.Initialize(sbc =>
{
sbc.UseBinarySerializer();
});
Run Code Online (Sandbox Code Playgroud)
并没有产生任何行为上的变化.我能够Consumes<PersonCreated>调用我的类的唯一方法是显式地将事件转换为PersonCreated类型.
Tra*_*vis 10
编辑:Serializer在这里无关紧要.我没有想到这一点.
您可以Bus.Instance.Publish通过对Event对象进行反射并获取其实际类型来调用正确的类型信息.这将是一些尴尬的代码,但一旦完成它可能很容易重用.在Magnum中,我们有一个扩展方法来帮助解决这个问题.
Bus.Instance.FastInvoke(new[]{ event.GetType() }, "Publish", event);
Run Code Online (Sandbox Code Playgroud)
加入我们的邮件列表http://groups.google.com/group/masstransit-discuss,我们很乐意详细讨论.