Как мне сделать IEditableОбъект.Закончился атомным?

#.net #transactions #atomic #ieditableobject

Вопрос:

Если бы у меня был класс адресов, реализующий IEditableObject, я мог бы завершить реализацию следующим образом:

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

Если в _city есть исключение, то _line1, _line2 и, возможно, _city должны вернуться.
Эта проблема не ограничивается EndEdit, но, вероятно, встречается и в других местах.

Ответ №1:

Рассматривали ли вы возможность использования области транзакций из системы.Транзакции? Это сделает ваш код транзакционным блоком и автоматически откатит изменение, если возникнет исключение.

Вы можете получить больший контроль над фиксацией и откатами, если используете CommittableTransaction, поэтому, возможно, вам захочется это рассмотреть.