EventSourcing 은 원하는 패턴처럼 들립니다.
간단한 "car"객체를 사용하여 예제를 보도록하겠습니다 (의사 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