MementoEntity and MementoEntityCollection

In Change Tracking Service we introduced a code snippet as the following:

var person = new Person();
person.FirstName = "first name value";
person.LastName = "last name value";

To start using memento services we can extend the above snippet as follows:

var memento = new ChangeTrackingService();
var person = new Person();
memento.Attach(person);
person.FirstName = "first name";
person.LastName = "last name";
var isChanged = memento.IsChanged; //true
var canUndo = memento.CanUndo; //true

Calling memento.Undo() will trigger the undo of the last operation, we can call Undo until CanUndo is true rolling back changes change by change. In the above sample calling Undo will revert back the LastName property value to its default value.

The requirement to achieve the above is that the Person class is a Radical memento entity:

class Person : MementoEntity
{
public String FirstName
{
get { return this.GetPropertyValue(() => this.FirstName); }
set { this.SetPropertyValue(() => this.FirstName, value); }
}
public String LastName
{
get { return this.GetPropertyValue(() => this.LastName); }
set { this.SetPropertyValue(() => this.LastName, value); }
}
}

As we can see from the above snippet all we need to do is to create a class the inherits from the MementoEntity base class and declare all the properties we want to track as Radical properties.

A similar approach can be used to keep track of items in a collection:

var memento = new ChangeTrackingService();
var list = new MementoEntityCollection<String>();
memento.Attach(list);
list.Add("a value");
list.Add("another value");
var isChanged = memento.IsChanged; //true
var canUndo = memento.CanUndo; //true

Calling memento.Undo() will trigger the undo of the last operation that in the above sample will revert the collection status removing the last added value.

We can do more: