मैं आवेदन/डोमेन परत में डीडीडी का उपयोग कर event-sourced सीक्यूआरएस कार्यान्वयन पर काम कर रहा हूं।क्या किसी ईवेंट-सोर्स किए गए कुल रूट को सोर्सिंग रिपोजिटरी की सुविधा होनी चाहिए?
public class Person : AggregateRootBase
{
private Guid? _bookingId;
public Person(Identification identification)
{
Apply(new PersonCreatedEvent(identification));
}
public Booking CreateBooking() {
// Enforce Person invariants
var booking = new Booking();
Apply(new PersonBookedEvent(booking.Id));
return booking;
}
public void Release() {
// Enforce Person invariants
// Should we load the booking here from the aggregate repository?
// We need to ensure that booking is released as well.
var booking = BookingRepository.Load(_bookingId);
booking.Release();
Apply(new PersonReleasedEvent(_bookingId));
}
[EventHandler]
public void Handle(PersonBookedEvent @event) { _bookingId = @event.BookingId; }
[EventHandler]
public void Handle(PersonReleasedEvent @event) { _bookingId = null; }
}
public class Booking : AggregateRootBase
{
private DateTime _bookingDate;
private DateTime? _releaseDate;
public Booking()
{
//Enforce invariants
Apply(new BookingCreatedEvent());
}
public void Release()
{
//Enforce invariants
Apply(new BookingReleasedEvent());
}
[EventHandler]
public void Handle(BookingCreatedEvent @event) { _bookingDate = SystemTime.Now(); }
[EventHandler]
public void Handle(BookingReleasedEvent @event) { _releaseDate = SystemTime.Now(); }
// Some other business activities unrelated to a person
}
DDD की मेरी समझ के साथ
अब तक, दोनों व्यक्ति और बुकिंग दो कारणों के लिए अलग कुल जड़ें हैं: मैं एक ऑब्जेक्ट मॉडल है कि इस तरह दिखता है
- रहे हैं बार जब व्यापार घटकों होगा डेटाबेस से अलग से बुकिंग ऑब्जेक्ट खींचें। (यानी, जारी किए गए व्यक्ति को गलत जानकारी के कारण पिछली बुकिंग में संशोधन किया गया है)।
- जब भी बुकिंग को अद्यतन करने की आवश्यकता होती है तो व्यक्ति और बुकिंग के बीच विवाद को लॉक नहीं करना चाहिए।
एक अन्य व्यावसायिक आवश्यकता यह है कि एक समय में एक बार एक व्यक्ति के लिए बुकिंग कभी नहीं हो सकती है। इसके कारण, मैं पठन पक्ष पर क्वेरी डेटाबेस से पूछताछ करने के बारे में चिंतित हूं क्योंकि संभावित रूप से वहां कुछ असंगतता हो सकती है (सीक्यूआरएस का उपयोग करने और अंत में लगातार पढ़ने वाले डेटाबेस होने के कारण)।
क्या कुल जड़ों को ऑब्जेक्ट्स के लिए आईडी द्वारा ईवेंट-सोर्स किए गए बैकिंग स्टोर से पूछने की अनुमति दी जानी चाहिए (आलसी लोडिंग उन्हें आवश्यकतानुसार)? क्या कार्यान्वयन के कोई अन्य मार्ग हैं जो अधिक समझ में आएंगे?
"सार्वजनिक व्यक्ति (पहचान पहचान) { लागू करें (नई PersonCreatedEvent (पहचान)); }" आप स्मृति से वस्तु का निर्माण कर रहे है, तो क्या होता है, आप एक नया व्यक्ति नहीं बना रहे हैं, लेकिन आप प्रकाशित कर रहे एक नया कार्यक्रम मैं इवेंट हैंडलर को परिभाषित करने के तरीके को पसंद करता हूं।इसलिए यह जानकर कि किसी ऑब्जेक्ट की स्थिति केवल एक रिपॉजिटरी को कमांड लागू करते समय बदल सकती है, हो सकता है कि आपको कमांड हैंडलर भी जोड़ना चाहिए, जब तक कि आप पूरी घटना के आधार पर नहीं जा रहे हैं, जो आईएमएचओ इतना समझ नहीं लेता है। – Marco
मुझे क्या पता नहीं चल रहा है कि आप एक ऐसी घटना को संभालने क्यों कर रहे हैं जिस पर आपका खुद का भंडार प्रकाशित होना चाहिए? "BookingCreatedEvent" – Marco