2016-12-05 30 views
1

我正在開發一個Asp.net MVC應用程序,並且我創建了一個錯誤處理系統,迫使我在BLL中爲每個函數創建以下代碼。圍繞一個功能與行動

try 
{ 
    ... 
    _unitOfWork.Save(nameof(Function)); 
} 
catch 
{ 
    if (rollbackTo != null) 
    { 
     _unitOfWork.RollbackToSave(rollbackTo); 
    } 
    else 
    { 
     _unitOfWork.Rollback(); 
    } 
    throw; 
} 

這基本上可以讓我管理我的交易根據要求和管理事務的錯誤處理沒有我的控制器知道關於實際的方式,這是正在做的 - 它只允許它來決定是否交易將繼續(rollbackTo參數)

我想知道的是,有沒有辦法讓我不必一遍又一遍地寫這段代碼?我想拋出一個異常,然後在我的管道中處理它 - 但是因爲我需要向用戶返回一個有價值的響應,而不僅僅是一個500個代碼 - 這不是一個真正的選擇。我想過可能創建一個調用和抽象方法的基類 - 並且按照函數實現它 - 但這也不起作用,因爲參數可能會改變。有任何想法嗎?

回答

2

是的,這是相當標準的。

例如,在基類

public void DoSomethingAndRollbackThenThrow(Action<IUnitOfWork> action) 
{ 
    try 
    { 
    ... 
    action(_unitOfWork); 
    } 
    catch 
    { 
    if (rollbackTo != null) 
    { 
     _unitOfWork.RollbackToSave(rollbackTo); 
    } 
    else 
    { 
     _unitOfWork.Rollback(); 
    } 
    throw; 
} 
} 

然後你就可以從派生類中調用它像這樣

public void DoSomethingSpecific() 
{ 
    base.DoSomethingAndRollbackThenThrow(unitOfWork => { 
    _unitOfWork.Save(nameof(Function)); 
    }); 
}