.net 如何使IEditableObject.EndEdit原子化?
如果我有一个实现IEditableObject的Address对象,我可能有如下的EndEdit实现:.net 如何使IEditableObject.EndEdit原子化?,.net,transactions,atomic,ieditableobject,.net,Transactions,Atomic,Ieditableobject,如果我有一个实现IEditableObject的Address对象,我可能有如下的EndEdit实现: public void EndEdit() { // BeginEdit would set _editInProgress and update *Editing fields; if (_editInProgress) { _line1 = _line1Editing; _line2 = _line2Editing;
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;
}
}
例如,如果更新状态时出现异常,则所有5个属性都应重置。这个原子更新问题可能不仅限于EndEdit。首先,Kent想知道为什么设置字段会引发异常是正确的。
忽视这个问题;您可以使用一个简单的:
try {
//do stuff
}
catch (Exception ex) {
//reset
//rethrow exception
throw;
}
每个字段的重置值是由什么组成的
- 最后一个值
- 默认值
- 某些表示无效状态的令牌值
- 上述内容的混合
如果您需要“重置”到最后一个值,那么您可能需要在对对象执行操作之前,以某种方式轻松存储对象状态,以及在出现问题时轻松恢复该状态的能力。用一种巧妙的方法来处理这个问题。我不使用字段来存储值。相反,我使用一个属性可以读写的哈希表。这给了我一个非常简单的设计
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
“重置”是指最后一个值。为什么我们要重置为默认值?我不确定无效的代币。不管怎样,我一定会查看Memento图案-谢谢!