2011-08-29 178 views
8

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

回答

10

编辑:串行器在这里没有关系。我没有想到这一点。

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

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

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

+0

啊..我今天一直在讨论这个问题的讨论清单,并认为这是一个很好的发布地点,因为更多人会在这里看到它。我将交叉发帖 –

+0

我们,MT开发者,在我们看到SO贴子之前会看到电子邮件。我们试图对问题做出很好的回应。 – Travis

+0

我已更新我的问题以包含有关我尝试使用BinarySerializer的信息。 –