#.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, поэтому, возможно, вам захочется это рассмотреть.