如何构建类似于 TransactionScope 的 class

How can I build class similar to TransactionScope

基本上我正在尝试构建类似于事务范围的东西,但要跟踪对象的变化。

我有一个摘要RecordableObjectclass大致如下:

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
}

TransactionScope之所以起作用,是因为受它影响的对象都参与了事务系统。所以在某种意义上他们 do "know about" TransactionScope class.

你的想法很酷,但我认为 "stock" .NET 框架中没有任何东西可以让你在不了解可记录对象的情况下完成你在这里尝试的事情录音机在某种程度上。