發(fā)布于:2021-01-27 10:35:56
0
84
0
面向方面編程(AOP)是一個非常好的概念,但實施起來有點困難。
老實說,我不認為我真的見過它成功的實現(xiàn),我的意思是,我確實見過一些例子,說明如何將它用于“跨領(lǐng)域”的關(guān)注,比如日志記錄。
問題是它通常很難使用,而我能想到的唯一實際應(yīng)用就是日志記錄。我知道,這可能只是我在這方面的知識不足,不過,如果您能接受我的建議,我將向您展示一個巧妙的小技巧,您可以通過執(zhí)行類似于AOP使用Action<>所做的操作來解決跨領(lǐng)域的問題。
把它放在一個地方
AOP試圖解決的主要問題是將存在于許多不同地方的軟件的某些方面濃縮到一個地方,以便您進行維護。
異常處理和日志記錄往往是這些橫切關(guān)注點中最臭名昭著的,毫無疑問,在代碼中的許多地方,您都有許多捕獲異常的實例,而您唯一真正能做的就是記錄它。
我將向您展示一種使用Action<>的簡單方法。
我從我的一個同事寫的代碼中得到了這個想法(他是個天才)。
他寫了一些代碼來完成我將要向您展示的工作,但是在重試數(shù)據(jù)庫查詢時,他能夠減少代碼庫中的許多地方,在這些地方,當出現(xiàn)死鎖或超時時,我們有重復(fù)的邏輯來重試執(zhí)行數(shù)據(jù)庫查詢。
這個代碼屬于您的嗎?
忽略我在這里遇到的一個普遍的例外,這是一個不好的做法,但有時你所要做的就是記錄發(fā)生的任何不好的事情并繼續(xù)前進。
在try塊中執(zhí)行某些操作并捕獲異常以記錄異常是很常見的。
想想這些代碼或類似的東西可能會在您的代碼庫中出現(xiàn)多少次。
Action<>
如果您不熟悉Action <>,請查看我的這篇文章--《解釋什么是動作和函數(shù)》,它對操作的工作原理給出了非常簡單的解釋。
我們可以采用try、catch和log異常的邏輯,并將其放入一個只隨我們所做的操作而變化的方法中。
我不太喜歡靜態(tài)方法,但在某些情況下,它們是有意義的。另一種選擇是將所有這些代碼散布在整個代碼庫中。
現(xiàn)在我們有了這個方法,我們可以做任何我們想做的事情,并且知道如果有錯誤它將被記錄。
看看這個:
如果您決定要更改記錄錯誤的方式或?qū)﹀e誤執(zhí)行的操作,可以在一個地方全部更改。
不僅用于記錄
您可以將這種解決方案應(yīng)用到代碼庫中涉及交叉問題的許多地方。
以下是一些建議,供您考慮使用這種解決方案:
重試失敗邏輯。
為故障使用替代服務(wù)(Web服務(wù)“ A”失敗,但我們可以使用Web服務(wù)“ B”)。
數(shù)據(jù)庫連接和連接關(guān)閉邏輯。(打開連接,執(zhí)行某些操作,關(guān)閉連接。)。