我知道日志記錄是AOP的主要用例。另外,日志記錄包裝器還作為您要使用DI的情況的示例,以便類不與特定的日志記錄實現耦合。但是,有些人認為記錄包裝器是反模式。首先,這種觀點是因為在大多數情況下,包裝器趨于簡單化并刪除了日志記錄框架特有的許多功能。如果要實現這些特定功能,為什么不直接使用框架。我知道Common.Logging門面嘗試為您抽象出log4Net,EntLib和NLog的大量功能。但是,即使在這里,我們仍然對Common.Logging有所依賴。不是以關于接口等的代碼/單元測試方式進行的,而是如果項目終止(自上一個發行版以來已經一年多了),或者您希望稍后切換到不受支持的記錄器,則可能會導致問題。也就是說,如果通過AOP實現日志記錄,是否甚至有必要使用DI作為日志記錄依賴項(即,為什么不直接引用NLog)呢?是的,代碼的AOP部分將緊密耦合,但是一個人要進行單元測試的類的邏輯沒有日志依賴(至少在編織發生之前)。在這一點上,我有點迷茫(我還沒有嘗試過AOP)。編織后,未將DI用于AOP代碼是否會對單元測試被測方法造成問題?還是可以在不編寫AOP代碼的情況下進行一次單元測試?除非軟件用戶需要日志記錄,否則我不確定測試使用模擬進行日志記錄有多大用處。我認為被測方法的業務邏輯是大多數測試所感興趣的。最后,如果要使用TDD / BDD,是否就不必使用DI來記錄AOP代碼中的日志依賴項?還是只是不試駕 AOP呢?如您所見,我正在嘗試了解最實際的方法是開發一種應用程序,該應用程序將同時使用AOP來解決交叉問題,并使用DI來進行設計/測試。由于AOP相對較新,并且日志記錄是最常見的示例,因此推薦的方法是什么?
2 回答

倚天杖
TA貢獻1828條經驗 獲得超3個贊
日志記錄不是服務,而是一個跨領域的問題。因此,最好用Decorator實現。但是,添加大量Decorators只是為了啟用各種不同服務的日志記錄會違反DRY,在這種情況下,您可以將這些Decorators進一步發展為單個Interceptor。
盡管可以使用IL編織實現AOP,但更好的選擇是使用支持動態攔截的DI容器,因為它是一種輕量級的解決方案。
這使您能夠將具體服務與日志完全脫鉤。那么,在這種情況下,我會說沒有理由包裝任何特定的日志記錄框架,因為如果您想更改日志記錄框架,則只需更改單個Interceptor。
這是一個討論用于裝飾的裝飾器和攔截器的示例(非常類似于記錄)。

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
動態攔截也是 AOP :)但是,我將您的問題解釋為與IL編織有關的AOP有關。在那種情況下,對于一個未開發的項目,我絕對看不到它有任何好處,但是在遺留代碼上,它可能是可行的,因為它允許您將方面應用于靜態,內部和/或私有類型和成員,而動態攔截則要求您針對接口(或基類)進行編程。
- 2 回答
- 0 關注
- 625 瀏覽
添加回答
舉報
0/150
提交
取消