在我當前的項目中,我使用的類實現了以下ITransaction
接口,如下所示。這是可以撤消的事務的通用接口。我也有一個TransactionSet
類,用於嘗試多個事務或事務集,並最終可用於創建事務樹。可以從Dispose()中引發事件嗎?
ITransaction
的某些實現會保留對對象實例或對象的臨時引用,以便在以後調用Undo()
時使用。稍後可以確認成功的交易,之後不再允許Undo()
,並且因此也不再需要臨時數據。目前我使用Dispose()
作爲我的確認方法來清理任何臨時資源。
但是,現在我希望我的交易也能夠引發事件以通知其他類別發生了什麼。除非交易確認,否則我不希望事件觸發。因爲我不希望允許事務通過撤消多次激發事件,然後再次運行。
由於我使用Dispose()
來確認事務是否還存在任何錯誤,因此也從這些事件中引發了這些事件?或者,在我的界面上單獨使用Confirm()
方法會更好,除了清除臨時數據的Dispose()
之外還會觸發事件?我不能想到任何我想確認的情況,但不能處理交易。然而,我不清楚我在Dispose()
內應該做什麼和不該做什麼。
public enum TransactionStatus
{
NotRun, // the Transaction has not been run, or has been undoed back to the original state
Successful, ///the action has been run and was successful
Error //there was an attempt to run the action but it failed
}
/// <summary>
/// Generic transaction interface
/// </summary>
public interface ITransaction
{
TransactionStatus Status { get; }
/// <summary>
/// Attempts the transaction returns true if successful, false if failed.
/// If failed it is expected that everything will be returned to the original state.
/// Does nothing if status is already Successful
/// </summary>
/// <returns></returns>
bool Go();
/// <summary>
/// Reverts the transaction
/// Only does something if status is successful.
/// Should return status to NotRun
/// </summary>
void Undo();
/// <summary>
/// A message describing the cause of the error if Status == Error
/// Otherwise equal String.Empty
/// </summary>
string ErrorMessage { get; }
}
許多.net類都有一個「Disposing」事件,如果沒有這個事件將非常困難。如果一個對象將持有對其他地方可能使用或可能不會使用的IDisposable的引用(例如,一個持有BackgroundImage的控件),則可以使用Disposing事件來允許主對象的持有者在必要時清理嵌套對象。 – supercat 2011-03-15 17:52:59