EventSourcing âm thanh thích mẫu mà bạn có thể tìm kiếm.
Chúng ta hãy lấy một ví dụ bằng cách sử dụng một đối tượng "xe hơi" đơn giản mà chúng ta muốn theo dõi màu sắc của (mã giả C # sau).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Với việc thực hiện CRUD khi chúng tôi cập nhật màu xe, màu trước đó sẽ bị mất.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Việc mất thông tin này đối với tôi giống như những gì bạn muốn tránh nhất (do đó không thích cập nhật và xóa một phần của mẫu CRUD).
Nếu chúng ta viết lại lớp xe thay vì trả lời các sự kiện khi cập nhật thay đổi thì nó có thể giống như thế này:
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;
}
}
Bây giờ chúng ta sẽ cập nhật màu sắc của đối tượng này như thế nào? Chúng tôi có thể tạo một sự kiện CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Lưu ý thiếu lưu trữ trên đối tượng mô hình thực tế? Đó là bởi vì thay vì duy trì mô hình trực tiếp, chúng tôi vẫn duy trì các sự kiện đưa mô hình về trạng thái hiện tại. Những sự kiện này nên được bất biến .
Bây giờ, hãy nhanh chóng chuyển tiếp và thay đổi màu sắc thêm một vài lần nữa:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Nếu chúng ta xem xét bộ lưu trữ sự kiện của chúng tôi (có thể là cơ sở dữ liệu quan hệ, dựa trên tệp, v.v.), chúng ta sẽ thấy một loạt các sự kiện liên quan đến đối tượng xe hơi của mình:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Nếu chúng ta muốn xây dựng lại đối tượng xe hơi đó, chúng ta có thể làm điều đó chỉ bằng cách tạo một đối tượng xe mới và áp dụng các sự kiện từ cửa hàng sự kiện của chúng ta vào đối tượng nói trên.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Với luồng sự kiện, chúng ta có thể đưa trạng thái của xe về khoảng thời gian trước đó chỉ bằng cách tạo một đối tượng xe mới và chỉ áp dụng các sự kiện mà chúng ta muốn:
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?
Chắc chắn là có: CR; P