如果我有一个实现 IEditableObject 的 Address 类,我可能会有这样的 EndEdit 实现:
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,其他地方也可能存在。
您是否考虑过使用 System.Transactions 中的 TransactionScope?这将使您的代码块具有事务性,并且如果引发异常,将自动回滚更改。
如果使用 CommittableTransaction,您可以获得对提交和回滚的更多控制,因此您可能需要考虑这一点。