2

私は ac# .net 4.0 ライブラリを構築しました。

すべてのメソッドは public および static です。

次のようなことを行うアスペクトプログラミングライブラリを使用してアスペクトを追加したい:

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)

すべてのメソッドを 1 つずつラップする代わりに、1 つのクラスに try/catch ルーチンを追加する方法があれば、アドバイスをお願いできますか?

4

2 に答える 2

5

ninjectstaticも、も、 に基づく他のものも、通常の方法に側面を追加できるため、役に立ちません。したがって、次の 2 つのオプションがあります。

手書きトレースデコレーター

既存のコードを変更せずに必要な機能を追加する別の手書きのトレース デコレータを追加します。

  • 利点
    • シンプルで簡単に自分で書く
  • 欠点
    • 呼び出しコンテキストはほとんどありません。実際にどのメソッドが呼び出され、どのパラメータが渡されたかなどを知りたい場合、これはトレースにとって重要です。
    • 既存のコードの周りの抽象化の新しいレイヤー。静的メソッドを呼び出す代わりに、内部で静的メソッド呼び出す Decorator を呼び出す必要があります。

// 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);
    }
}

完全なサンプルはこちらから入手できます

ポストシャープ

を使用した非侵襲的トレースとロギングをご覧ください

  • 利点
    • 既存のコードを変更したり、自分で属性を追加したりせずに、アスペクトをブロードキャストします。
    • 関心の分離: トレース/ロギングはロジックから分離されています
    • そしてもっとたくさん…
  • 欠点
    • 何も無料ではありません。ただし、機能が制限された無料の PostSharp エディションを利用できます
    • ポストコンパイルのため、他のツールと統合される場合がある
于 2013-01-04T22:02:11.357 に答える
0

オープン ソース プロジェクトであるNConcern .NET AOP Frameworkを参照してください。

あなたの静的クラス

static public class Calculator
{
    static public int Add(int a, int b)
    {
        return a + b;
    }
}

ロガー

static public class Logger
{
    static public void Log(MethodInfo method, object[] arguments, Exception exception)
    {
        Console.WriteLine("{0}({1}) exception = {2}", method.Name, string.Join(", ", arguments), exception.Message);
    }
}

アスペクト : ログオン例外

public class Logging : IAspect
{
    public IEnumerable<IAdvice> Advise(MethodInfo method)
    {
        yield return Advice.Basic.After.Throwing((instance, arguments, exception) => 
        {
            Logger.Log(method, arguments, exception);
        });
    }
}

Joinpoint : 電卓のメソッド

var calculatorMethods = new Func<MethodInfo, bool>(method => method.ReflectedType == typeof(Calculator));

ジョインポイントのロギング アスペクトを有効にする

Aspect.Weave<Logging>(calculatorMethods);
于 2016-12-13T05:52:21.520 に答える