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

Inf*_*ner 2 .net c# aop

我已经构建了ac#.net 4.0库.

所有方法都是公共的和静态的.

我想使用方面编程库添加一个方面,它执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

如果有办法在一个类中添加try/catch例程而不是逐个包装所有方法,请你建议吗?

Aki*_*kim 5

因为你所提到的字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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有完整的样品

PostSharp

使用查看非侵入性跟踪和日志记录

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