C# 如何构建类似TransactionScope的类

C# 如何构建类似TransactionScope的类,c#,.net,multithreading,transactionscope,C#,.net,Multithreading,Transactionscope,基本上,我正在尝试构建类似于事务范围的东西,但要跟踪对象中的更改 我有一个抽象的RecordableObject类,大致如下所示: public abstract class RecordableObject : INotifyPropertyChanged { protected virtual void RaisePropertyChanged(string prop) { // remember previous values if recording is

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

我有一个抽象的
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 void TestRecorder(MyClass recorableObj)
{
    recorableObj.Foo = 1;
    using (var recorder = new ThreadStaticRecorder())
    {
         recorableObj.Foo = 2;
         recorder.Undo();
    }

    Console.WriteLine(recorableObj.Foo); // 1
}
还有一台录音机,我想管理所有事情:

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;
    }
}

TransactionScope工作的原因是受其影响的对象都参与到事务系统中。所以在某种意义上,他们确实“知道”TransactionScope类


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

CSLA可以为你提供这种功能。N级撤消、更改跟踪(坏规则、脏属性)、对象图的事务性保存和业务规则。您看过
Memento
pattern了吗?好的,这并不让我感到惊讶。谢谢没有,我正在考虑将对
IChangesRecorder
的依赖注入到
可记录对象中的最佳方法。由于要处理静态字段,这有点棘手。@ArturUdod-是的,我认为您需要一个基本的“RecordableObject”类,所有其他可记录对象都从该类中分离出来。然后,在该基类的构造函数中,如果存在环境记录器,可以调用“注册”它。