2015-07-29 6 views
4

В основном я пытаюсь создать нечто похожее на область транзакции, но отслеживать изменения в объектах.Как я могу построить класс, похожий на 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 
} 
+0

CSLA может предоставить вам такую ​​функциональность. Отмена N-уровня, отслеживание изменений (нарушенные правила, грязные свойства), транзакционное сохранение графиков объектов и бизнес-правил. – Kev

+0

Вы посмотрели на шаблон 'Memento' – 3dd

ответ

2

Причина TransactionScope работы является то, что объекты, пострадавшие от него все участвуют в системе транзакций. Поэтому в некотором смысле они do «знают о» классе TransactionScope.

У вас есть классная идея, но я не думаю, что в «фондовой» платформе .NET есть что-то, что позволит вам выполнить то, что вы пытаетесь здесь, без того, чтобы ваши записываемые объекты знали о записывающем устройстве в в некотором роде.

+0

Хорошо, меня это не удивительно. Благодаря! Нет, я думаю о лучшем способе введения зависимости от 'IChangesRecorder' в' RecordableObject'. Это немного сложно из-за статических полей. –

+0

@ArturUdod - да, я думаю, вам нужно будет иметь базовый класс «RecordableObject», из которого все другие записываемые объекты могут отказаться. Затем в конструкторе для этого базового класса вы можете позвонить «зарегистрировать» его с помощью внешнего регистратора, если он существует. –