2012-02-07 7 views
5
क्षेत्रों के साथ

को देखते हुए घटना की दुकान:कैसे करने के लिए डोमेन घटना संरचना में परिवर्तन के बाद ऐतिहासिक घटनाओं को पुनः प्राप्त करने

  • AggregateId: पूर्णांक
  • पेलोड: ब्लॉब
  • संस्करण: पूर्णांक

कौन सा घटनाओं में शामिल है इस पर आधारित:

public class OrderLineAdded 
{ 
    int Id; 
    short Quantity; 
} 
public class OrderLineAdded 
{ 
    int ProductId; // field name has changed 
    int Quantity; // field datatype has changed 
} 

जब यह ऐतिहासिक डेटा लिया गया है (विश्लेषण, आदि के लिए), तुम कैसे द्विआधारी पेलोड सार्थक डेटा में फिर से संगठित है:... और फिर आगे की घटनाओं एक अद्यतन संरचना के साथ जोड़ा गया है?

नोट: उपरोक्त कोड एक अच्छा ईवेंट/ईवेंट स्टोर कार्यान्वयन का उदाहरण नहीं है। मैं सिर्फ यह जानना चाहता हूं कि इस परिदृश्य को कैसे संभाला जाना चाहिए।

+0

आप दूसरे संस्करण और deserialise संस्करण के आधार पर के लिए संस्करण संख्या को बढ़ाना होगा? –

+0

@LukeMcGregor हाँ, मैं उन पंक्तियों के साथ सोच रहा था। मैं जानना चाहता हूं कि कोई अलग/बेहतर दृष्टिकोण है या नहीं? –

उत्तर

3

रिनत अब्दुलिन अपने सीक्यूआरएस ब्लिकी में कुछ डोमेन इवेंट वर्जनिंग रणनीतियों की रूपरेखा बताते हैं जिन्हें आप पढ़ने के लिए उपयोगी पा सकते हैं।

  1. एक serializer कि स्वचालित रूप से इस तरह के गूगल के Protobuf Serializer के रूप में अपने घटना में संपत्तियों की नाम के साथ सामना कर सकते हैं का उपयोग करें:

    https://abdullin.com/post/event-sourcing-versioning/

    वह दो संभावित दृष्टिकोण पता चलता है।

  2. अपने आप को स्मृति में मैन्युअल रूप से अपग्रेड करने के लिए निम्न इंटरफ़ेस को लागू करें।
public interface IUpgradeDomainEvents 
{ 
    IEnumerable<IDomainEvent> Upgrade(IDomainEvent e, string id); 
} 
1

पिछली संगतता को संभालने के लिए मैंने देखा एकमात्र तरीका यह है कि आपके ईवेंट में प्रत्येक बदलाव का संस्करण है। कुछ लोगों को एक अलग नाम स्थान में नए संस्करण बनाते हैं ताकि नाम स्थान संस्करण/सुविधा जानकारी को दर्शाता है:

namespace Foo.ProjectA.Release1 
{ 
    public interface ISomeEvent {...} 
} 

namespace Foo.ProjectA.Release3 
{ 
    public interface ISomeEvent {...} 
} 

वैकल्पिक रूप से, वर्ग के नाम में संस्करण/सुविधा की जानकारी के साथ वर्ग का एक नया संस्करण बनाने के लिए:

namespace Foo.ProjectA 
{ 
    public interface ISomeEvent {...} 
    public interface ISomeEvent_MoreRefinedVersion {...} 
} 

व्यक्तिगत रूप से, मैं पूर्व दृष्टिकोण पसंद करता हूं, जब तक नया संस्करण घटना के लिए अधिक विशिष्ट अर्थपूर्ण अर्थ जोड़ता है।

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

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