2016-10-27 3 views
-1

コンソールアプリケーションでエラー例外を処理するためにAOPを使用したいと思います。 (エラーが発生した場合、それは誤りヨーヨー私の属性側のコードをスローする必要があります)シンプルなアスペクト指向のコンセプトを使用して、ポストシャープなしの例外処理を処理する方法はありますか?

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
public class HandleError : Attribute 
{ 
    public HandleError(string description) 
    { 
     try 
     { 
      this.Description = description; 
     } 
     catch (Exception) 
     { 

      throw; 
     } 

    } 
    public string Description { get; set; } 


} 

この意志:以下の私のコード(それは私はMVCでエラーを処理するために、属性の花瓶のプログラミングを使用しますが、これはコンソールアプリケーションであるMVCではありません)私の方法からの呼び出し:

[HandleError("Error occurs here")] 
    public static void MyMethod(string data) 
    { 
     throw new Exception(); 

実際には、私は私のメソッド内で例外を処理するためにAOPを使いたい。私はそれがエラーが発生した場合、属性を呼び出す必要があります。しかし、どのように? (ポストシャープを提供しないでください、それはお金が必要ですが、私はオープンソースにもオープンしています)ところで、なぜそれが簡単ではない、私は理解していない。

答えて

1

基本的に、PostSharpは、属性がマークされたメソッドの前後に実行されるコンパイル時にアセンブリにコードを組み込むことを基本としています。これは実行時に動的に作成されるコードを使用しないため、パフォーマンスの観点からは非常に優れています。

他のAOPフレームワーク(またはIoCコンテナ)では、実行時にメソッドへの呼び出しをインターセプトするコードを含む動的なプロキシを生成するオプションを提供しています。

いずれかのフレームワーク(IoCとインターセプトを探します)を使用するか、同等の機能を自分で実装します。基本的には、インターセプトするコードをクラスに移動し、メソッドをvirtualとマークする必要があります。実行時には、クラスから継承した動的に作成されたクラスを使用してクラスのインスタンスを修飾し、メソッドの呼び出しの前後に追加のコードを実行するようにメソッドをオーバーライドします。

しかし、コンソールアプリケーションのニーズに合った簡単な方法があるかもしれません。代わりに属性を持つメソッドをマークするの、あなたはまた、あなたがメソッドの前と後に実行するコードが含まれているいくつかのヘルパー関数を作成することができます。

void Main() 
{ 
    int value = GetValue(123); 
    DoSomething(value); 
} 

void DoSomething(int myParam) 
{ 
    RunAndLogError(() => { 
     // Place code here 
     Console.WriteLine(myParam); 
     }); 
} 

int GetValue(int myParam) 
{ 
    return RunAndLogError(() => { 
     // Place code here 
     return myParam * 2;}); 
} 

void RunAndLogError(Action act) 
{ 
    try 
    { 
     act(); 
    } 
    catch(Exception ex) 
    { 
     // Log error 
     throw; 
    } 
} 

T RunAndLogError<T>(Func<T> fct) 
{ 
    try 
    { 
     return fct(); 
    } 
    catch(Exception ex) 
    { 
     // Log error 
     throw; 
    } 
} 

あなたが見ることができるように、RunAndLogErrorの2つのオーバーロードがあり、 1つはvoidメソッド用、もう1つは値を返すメソッド用です。

この目的のためにグローバル例外ハンドラを使用することもできます。詳細については、この回答をご覧ください:.NET Global exception handler in console application

関連する問題