gpt4 book ai didi

C# 如何将 AOP 用于静态方法?

转载 作者:行者123 更新时间:2023-12-02 05:19:13 28 4
gpt4 key购买 nike

我已经构建了一个 c# .net 4.0 库。

所有的方法都是公共(public)的和静态的。

我想使用执行以下操作的方面编程库添加方面:

try block
1. call method (if method throws exception)

catch block
2. log the exception and massage the exception

it is a dll (class library project)

如果有一种方法可以在一个类中添加 try/catch 例程而不是一个一个地包装所有方法,请问您能否提出建议?

最佳答案

因为你提到了单词static 既不是也不也不是基于 的任何其他内容会帮助你,因为他们能够围绕常规方法添加方面。所以你有两个选择:

手写追踪装饰器

添加单独的手写跟踪装饰器,无需更改现有代码即可添加所需的功能

  • 好处
    • 简单易写自己写
  • 缺点
    • 几乎没有通话背景。这对于跟踪很重要,如果您想知道实际调用了哪些方法以及传递了哪些参数等。
    • 围绕现有代码的新抽象层。您必须调用将在内部调用您的静态方法的装饰器,而不是调用您的静态方法

例子

// Decorated calls
TraceDecorator.Aspect(() => StaticLogic.SuccessfulCall());
TraceDecorator.Aspect(() => StaticLogic.ExceptionCall());
TraceDecorator.Aspect(() => StaticLogic.SuccessfulCallWithReturn(42));
TraceDecorator.Aspect(() => StaticLogic.ExceptionCallWithReturn(42));

// Decorator itself
public static class TraceDecorator
{
public static T Aspect<T>(Func<T> func)
{
try
{
return func();
}
catch(Exception ex)
{
LogException(ex);

return default(T);
}
}

public static void Aspect(Action func)
{
try
{
func();
}
catch(Exception ex)
{
LogException(ex);
}
}

private static void LogException(Exception ex)
{
Console.WriteLine("Traced by TraceDecorator: {0}", ex);
}
}

提供完整 sample here

后锐化

看看Non-Invasive Tracing & Logging

  • 好处
    • 在不更改现有代码或自行添加属性的情况下广播您的方面,无论您认为合适
    • 关注点分离:跟踪/日志记录与您的逻辑分离
    • 还有很多……
  • 缺点
    • 没有免费的东西。但是有一个功能有限的免费 PostSharp 版本
    • 有时会因为后期编译而与其他工具集成

关于C# 如何将 AOP 用于静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164814/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com