2011-08-29 12 views
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 प्रकार पर एक ईवेंट डालना है।

उत्तर

10

संपादित करें: सीरिएलाइज़र यहां कोई फर्क नहीं पड़ता। मैंने इसे नहीं सोचा था।

आप Bus.Instance.Publish को Event ऑब्जेक्ट पर प्रतिबिंबित करके सही प्रकार की जानकारी के साथ बुला सकते हैं और इसके वास्तविक प्रकार को भी प्राप्त कर सकते हैं। यह कुछ अजीब कोड होने जा रहा है लेकिन एक बार ऐसा करने के बाद इसे फिर से उपयोग करना आसान हो जाता है। मैग्नम में हमारे पास इसकी सहायता करने के लिए एक विस्तार विधि है।

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

मेलिंग सूची, http://groups.google.com/group/masstransit-discuss पर हमसे जुड़ें, और हम अधिक जानकारी में चर्चा करने के लिए खुशी होगी।

+0

आह .. मैं आज इस समस्या के लिए चर्चा सूची स्कैन कर रहा हूं, और सोचा कि यह पोस्ट करने के लिए एक शानदार जगह थी, क्योंकि इसे यहां और अधिक देखेंगे। मैं –

+0

पार कर दूंगा, हम एमटी डेवलपर्स, एसओ पोस्ट देखेंगे इससे पहले ईमेल देखेंगे। हम सवालों के लिए काफी उत्तरदायी होने की कोशिश करते हैं। – Travis

+0

मैंने अपने प्रश्न को अद्यतन किया है ताकि बाइनरीसेरियलाइज़र –

संबंधित मुद्दे