MassTransit消息错误输入

时间:2011-08-29 22:58:20

标签: c# event-handling masstransit

我正在尝试通过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 个答案:

答案 0 :(得分:10)

编辑:Serializer在这里无关紧要。我没有想到这一点。

您可以通过对Bus.Instance.Publish对象进行反射并获取其实际类型来使用正确的类型信息调用Event。这将是一些尴尬的代码,但一旦完成它可能很容易重用。在Magnum,我们有一个扩展方法来帮助解决这个问题。

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

加入我们的邮件列表http://groups.google.com/group/masstransit-discuss,我们很乐意详细讨论。