在所有的解決方案,我實現了這個本質常識通常決定了你簡單地從DAL報告錯誤。
通過事務性地執行任何數據庫更改,您將確保執行回滾,並用您自己的實際例外來說明發生了內部異常,並且因此未做任何更改。
在BLL中,異常然後被捕獲,然後作爲調用應用程序的自定義「BusinessProcessException」拋出。可選地,BLL因爲它在它自己的「盒子」中,所以有時它有自己的記錄機制來記錄與業務流程有關的異常。
天氣已記錄或不在BLL層,您仍然需要通知UI層(客戶端應用程序)發生異常並記錄回傳完整的異常樹。
UI層中的客戶端應用程序代碼可能有自己的日誌,但不會是BLL使用的日誌。
事件週期是這樣的......
應用程序調用BLL方法 BLL方法調用DAL方法 分貝的 存儲過程中的錯誤拋出(例如)SQL異常 DAL拋出存儲過程的DAL方法調用以sqlexception爲內部的新dal異常 bll處理dal異常和日誌dal失敗 如果調用的bll方法存在某些事務元素,則bll將回滾其他調用。 bll拋出新的bll框架異常內部是dal異常 應用程序處理bll異常並決定如何處理來自完整異常樹的用戶體驗。
這幾乎是所有.net的作品。
注意事項:
如果我失敗的更新呼叫的業務對象,該業務對象可能有被更新爲呼叫的一部分幾個子對象。 這些子對象可以從不同的服務器上的多個DAL端點進行組裝和每個DAL端點可能有潛在的幾個分貝的
所以,你必須爲每個DAL BLL層邏輯和1交易調用內部運作來更新多個記錄,然後在每個存儲的proc調用中可能有1個。
.net在後臺執行的操作是以這樣一種方式堆棧,即如果bll級別的事務失敗並且調用了回滾,它應該回滾所有的子事務,但是在現實世界中事務跨越系統並且經常網絡這可能是不可能的。
因此,您必須假設您採取的操作可能會失敗,並且如果任何部分的失敗都會失敗,並且代碼調用對此負責。
這最終意味着什麼,你需要一個完整的審計跟蹤發生了什麼。 作爲一個bll開發我記錄我的框架無論如何做的一切,sql也有事務日誌,所以在這方面簡化了很多dal實現。
應用程序具有(對於asp.net)服務器日誌或僅限自定義選項。
我會推薦的唯一的事情是,每一層記錄自己的活動和日誌分開(例如,一個用戶界面相關的錯誤是不是真的東西,在BLL日誌所屬)
來源
2011-07-19 09:02:30
War
你就不能使用內部異常並讓它表明層的變化? – faester