如何构建类似于TransactionScope的类

时间:2015-07-29 12:27:38

标签: c# .net multithreading 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
}

1 个答案:

答案 0 :(得分:2)

TransactionScope的工作原理是受其影响的对象都参与了事务系统。所以在某种意义上,他们“了解”TransactionScope类。

你所拥有的是一个很酷的想法,但是我认为“库存”.NET框架中没有任何东西可以让你完成你在这里尝试的东西而没有你的可记录对象知道某些记录器方式。