EventSourcing soa como o padrão que você pode estar procurando.
Vamos dar um exemplo usando um objeto "car" simples que gostaríamos de acompanhar a cor de (segue o pseudo código C #).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Com uma implementação CRUD, quando atualizamos a cor do carro, a cor anterior seria perdida.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Essa perda de informações me parece o que você mais gostaria de evitar (daí a aversão à atualização e a exclusão de parte do padrão CRUD).
Se reescrevéssemos a classe car, para responder a eventos ao atualizar sua alteração, pode ser assim:
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;
}
}
Agora, como atualizaríamos a cor desse objeto? Poderíamos criar um evento CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Observe a falta de um salvamento no objeto de modelo real? Isso ocorre porque, em vez de persistir o modelo diretamente, persistimos os eventos que colocam o modelo no estado atual. Esses eventos devem ser imutáveis .
Agora vamos avançar e mudar a cor mais algumas vezes:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Se analisássemos nosso armazenamento de eventos (poderia ser um banco de dados de relações, com base em arquivos etc.), veríamos uma série de eventos relacionados ao nosso objeto carro:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Se quiséssemos reconstruir esse objeto de carro, poderíamos fazê-lo simplesmente criando um novo objeto de carro e aplicando os eventos de nosso armazenamento de eventos ao referido objeto.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Com o fluxo de eventos, podemos reverter o estado do carro para um período anterior, simplesmente criando um novo objeto de carro e aplicando apenas os eventos que queremos:
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?
Claro que existe: CR; P