8

我在尝试通过 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类型。

4

1 回答 1

10

编辑:序列化器在这里无关紧要。我没有想到这一点。

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

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

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

于 2011-08-29T23:32:40.117 回答