c# – 我如何构建类似于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
}

最佳答案 TransactionScope工作的原因是受其影响的对象都参与了事务系统.因此在某种意义上,他们“了解”TransactionScope类.

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

点赞