Как сделать IEditableObject.EndEdit атомарным? - PullRequest
0 голосов
/ 07 октября 2008

Если у меня есть объект Address, который реализует IEditableObject, я мог бы иметь реализацию EndEdit, например:

public void EndEdit()
{
    // BeginEdit would set _editInProgress and update *Editing fields;
    if (_editInProgress)
    {
        _line1 = _line1Editing;
        _line2 = _line2Editing;
        _city = _cityEditing;
        _state = _stateEditing;
        _postalCode = _postalCodeEditing;
        _editInProgress = false;
    }
}

Например, при обновлении исключения _state все 5 свойств должны быть сброшены Эта проблема атомарного обновления, вероятно, не ограничивается EndEdit.

Ответы [ 2 ]

1 голос
/ 07 октября 2008

Во-первых, Кент прав, задаваясь вопросом, почему установка поля может вызвать исключение.
Игнорируя этот вопрос; Вы можете просто использовать простое:

try {
  //do stuff
}
catch (Exception ex) {
  //reset

  //rethrow exception
  throw;
}

Сложности возникают в отношении того, что составляет значение сброса для каждого поля?

  • Последнее значение
  • Значение по умолчанию
  • Некоторое значение токена, обозначающее недопустимое состояние
  • Смесь вышеперечисленного

Если вам нужно «сбросить» до последнего значения, вам, вероятно, понадобится какой-нибудь способ легко сохранить состояние объекта перед тем, как что-то с ним делать, наряду с возможностью легко восстановить это состояние, если что-то пойдет не так. Посмотрите Pattern Momento на изящный способ справиться с этой проблемой.

0 голосов
/ 16 июля 2010

Я не использую поля для хранения значений. Вместо этого я использую хеш-таблицу, которую свойства могут читать и записывать. Это дает мне действительно простой дизайн.

Friend Sub BeginEdit()
    m_Backup = New Dictionary(Of String, Object)(m_DataPoints, StringComparer.OrdinalIgnoreCase)
End Sub

Friend Sub CancelEdit()
    If m_Backup IsNot Nothing Then m_DataPoints = m_Backup
End Sub

Friend Sub EndEdit()
    m_Backup = Nothing
End Sub
...