В основном я пытаюсь создать нечто похожее на область транзакции, но отслеживать изменения в объектах.Как я могу построить класс, похожий на TransactionScope
У меня есть абстрактный класс RecordableObject
примерно глядя следующим образом:
public abstract class RecordableObject : INotifyPropertyChanged
{
protected virtual void RaisePropertyChanged(string prop)
{
// remember previous values if recording is on
var e = PropertyChanged;
if (e != null)
{
e(this, new PropertyChangedEventArgs(prop));
}
}
public void UndoChanges()
{
}
public void StartRecording()
{
}
public void SuspendRecording()
{
}
public void StopRecording()
{
}
public event PropertyChangedEventHandler PropertyChanged;
}
И самописец, которого я хочу, чтобы управлять всеми вещами:
public class ThreadStaticRecorder : IDisposable, IChangesRecorder
{
[ThreadStatic]
private static List<RecordableObject> recordingList;
public void Record(RecordableObject recordableObject)
{
if (recordingList == null)
{
recordingList = new List<RecordableObject>();
}
recordingList.Add(recordableObject);
}
public void Forget(RecordableObject recordableObject)
{
if (recordingList == null)
{
return;
}
recordingList.Remove(recordableObject);
}
public void Undo()
{
}
public void Dispose()
{
recordingList = null;
}
}
Теперь дело в том, я не знаю, как связать рекордер и записываемые объекты вместе, и я не хочу, чтобы записываемые объекты ничего не знали о записывающем устройстве.
В идеале я хотел бы иметь возможность использовать его следующим образом:
public void TestRecorder(MyClass recorableObj)
{
recorableObj.Foo = 1;
using (var recorder = new ThreadStaticRecorder())
{
recorableObj.Foo = 2;
recorder.Undo();
}
Console.WriteLine(recorableObj.Foo); // 1
}
CSLA может предоставить вам такую функциональность. Отмена N-уровня, отслеживание изменений (нарушенные правила, грязные свойства), транзакционное сохранение графиков объектов и бизнес-правил. – Kev
Вы посмотрели на шаблон 'Memento' – 3dd