EventSourcingดูเหมือนรูปแบบที่คุณอาจมองหา
ลองมาตัวอย่างโดยใช้วัตถุ "รถยนต์" ง่าย ๆ ที่เราต้องการติดตามสี (หลอกรหัส C # ดังนี้)
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
ด้วยการใช้ CRUD เมื่อเราอัปเดตสีของรถสีก่อนหน้านี้จะหายไป
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
การสูญเสียข้อมูลนี้ทำให้ฉันรู้สึกว่าสิ่งที่คุณต้องการหลีกเลี่ยงมากที่สุด (ดังนั้นจึงไม่ชอบการอัพเดทและลบส่วนหนึ่งของรูปแบบ CRUD)
หากเราต้องเขียนคลาสรถใหม่เพื่อตอบสนองต่อกิจกรรมแทนเมื่ออัปเดตการเปลี่ยนแปลงอาจมีลักษณะเช่นนี้:
public class Car {
public string Color { get; private set; } // Cannot be set from outside the class
public void ApplyEvent(CarColorChangedEvent e) {
this.Color = e.Color;
}
}
ตอนนี้เราจะปรับปรุงสีของวัตถุนี้ได้อย่างไร เราสามารถสร้างกิจกรรมCarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
สังเกตเห็นว่าไม่มีการบันทึกบนวัตถุโมเดลจริงหรือไม่? นั่นเป็นเพราะแทนที่จะทำให้โมเดลคงอยู่โดยตรงเราคงเหตุการณ์ที่ทำให้โมเดลอยู่ในสถานะปัจจุบัน เหตุการณ์เหล่านี้ควรจะเปลี่ยนรูป
ตอนนี้ขอกรอไปข้างหน้าและเปลี่ยนสีอีกสองสามครั้ง:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
ถ้าเราดูที่การจัดเก็บเหตุการณ์ของเรา (อาจเป็นฐานข้อมูลความสัมพันธ์, ไฟล์, ฯลฯ ) เราจะเห็นชุดของเหตุการณ์ที่เกี่ยวข้องกับวัตถุรถยนต์ของเรา:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
หากเราต้องการสร้างรถยนต์ชิ้นนั้นขึ้นมาใหม่เราสามารถทำได้โดยการสร้างวัตถุรถยนต์ใหม่และใช้กิจกรรมจากที่จัดกิจกรรมของเรากับวัตถุดังกล่าว
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
ด้วยกระแสของเหตุการณ์ที่เราสามารถย้อนกลับสถานะของรถไปสู่ช่วงเวลาก่อนหน้าเพียงแค่สร้างวัตถุรถใหม่และใช้เหตุการณ์ที่เราต้องการเท่านั้น:
var MyCar = new Car();
var event = MyDatabase.GetFirstEventForCar("CarIdentifierHere");
MyCar.ApplyEvent(e);
Console.WriteLine(MyCar.Color); // Red
Is there a term for this? Basically only creating and reading data?
แน่ใจว่ามี: CR; P