在没有外部 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中文网其他相关文章!