在沒有外部 AOP 函式庫的情況下攔截 C# 方法呼叫:解決方法和限制
C# 固有地缺乏內建 AOP 功能,這在不依賴第三方函式庫的情況下攔截方法呼叫時帶來了挑戰。 然而,有幾種策略可以近似這個功能,每種策略都有自己的權衡:
方法呼叫攔截的方法:
自訂屬性和 MarshalByRefObject: 此技術利用繼承自 [Log]
的自訂屬性(例如 IMessageSink
)。 但是,它需要繼承 MarshalByRefObject
,這可能會帶來效能開銷。
動態程式碼注入(反射):運行時反射可以將程式碼注入到方法中,從而允許攔截。 這種方法要複雜得多,需要對反射有深入的了解,並可能影響可維護性。
利用 IoC 容器: 依賴注入 (DI) 容器提供了一種攔截方法呼叫的機制,但並非全面地適用於所有方法。 其適用性取決於特定的攔截要求。
修改呼叫者方法:最簡單的解決方案(如果可行)涉及直接修改呼叫者方法,以在目標方法呼叫之前和之後包含日誌記錄或其他攔截邏輯。 這很簡單,但需要更改現有程式碼。
說明性範例:呼叫方方法修改
以下範例示範了使用呼叫者方法修改的簡單攔截:
<code class="language-csharp">public class Caller { public static void Call() { Traced traced = new Traced(); Logger.LogMethodStart(typeof(Traced).GetMethod(nameof(Traced.Method1)), new object[] { "name", 5 }); traced.Method1("name", 5); Logger.LogMethodEnd(typeof(Traced).GetMethod(nameof(Traced.Method1))); Logger.LogMethodStart(typeof(Traced).GetMethod(nameof(Traced.Method2)), new object[] { new object() }); traced.Method2(new object()); Logger.LogMethodEnd(typeof(Traced).GetMethod(nameof(Traced.Method2))); } }</code>
這種方法直接在目標方法呼叫周圍新增日誌記錄呼叫。 請注意,需要單獨實作 Logger
類別來處理日誌記錄詳細資訊。 如果可以接受修改呼叫者,則此方法是侵入性最小的。 其他選項提供了更通用的解決方案,但代價是複雜性增加。
以上是如何在不使用AOP函式庫的情況下攔截C#中的方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!