如何构建类似于TransactionScope的类?

本文关键字:类似于 TransactionScope 的类 构建 何构建 | 更新日期: 2023-09-27 18:05:24

基本上我试图建立一些类似于事务作用域,但跟踪对象的变化。

我有一个抽象的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工作的原因是受它影响的对象都参与到事务系统中。所以在某种意义上,它们确实"知道"TransactionScope类。

你有一个很酷的想法,但是我不认为在"stock" . net框架中有任何东西可以允许你在没有你的可记录对象以某种方式意识到记录器的情况下完成你在这里尝试的事情。