2012-11-03 14 views
13

独自の実装を続ける前に、同じ関数を実行する必要があるさまざまなメソッドがあります。今私は各メソッドでこれらの関数を実装することができましたが、これを行うにはattributesを悪用する方法があるのだろうかと思っていましたか?非常に簡単な例として、すべてのネットワークコールでネットワーク接続を確認する必要があります。アトリビュートを使用してメソッドを呼び出す

public void GetPage(string url) 
{ 
    if(IsNetworkConnected()) 
     ... 
    else 
     ...   
} 

これは動作しますが、私は、ネットワークを使用する各メソッドのIsNetworkConnectedメソッドを呼び出し、個別にそれを処理する必要があると思います。代わりに、私はこの

[NetworkCall] 
public void GetPage(string url) 
{ 
    ... 
} 

を行うしたいネットワークが利用できない場合は、そうでない場合はGetPageが呼び出され、エラーメソッドが代わりと呼ばれ、GetPageは無視されます。

これはAspect Orientated Programmingによく似ていますが、いくつかの呼び出しではフレームワーク全体を実装したくありません。これは実装よりも学習の練習のほうが多いので、このようなものがどのように実装されるのが最も好奇妙なのです。

+0

継承はどうですか?それらのすべてを、基本的な "ネットワーク"クラスまたはそのようなものから派生させる。 – gdoron

答えて

3

あなたはPostSharpを使用することができ、それは.NETのためのアスペクト指向フレームワークであり、それはquite easy to useようだ:

static void Main(string[] args) 
{ 
    Foo(); 
} 

[IgnoreMethod(IsIgnored=true)] 
public static void Foo() 
{ 
    Console.WriteLine("Executing Foo()..."); 
} 

[Serializable] 
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect 
{ 
    public bool IsIgnored { get; set; } 

    public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args) 
    { 
     if (IsIgnored) 
     { 
      return; 
     } 

     base.OnInvoke(args); 
    } 
} 

メソッドレベルの側面機能が無料版で提供されています:http://www.sharpcrafters.com/purchase/compare

ランタイムパフォーマンス:

PostSh arpはコンパイラ技術であり、高価な作業の大部分はビルド時に行われるため、アプリケーションは迅速に起動して高速に実行されます。コードを生成するとき、PostSharpは、仮想メソッドの呼び出しや静的フィールドの取得が高価な操作であると仮定しています。うわさとは対照的に、PostSharpは実行時にSystem.Reflectionを使用しません。 http://www.sharpcrafters.com/postsharp/performance

+0

私はPostSharpが反射のレイヤーを通過しなければならないため、PostSharpは非効率的だと思っていましたが、コンパイル時にはほとんどのものがそうですね。いい、きれいなAPI。私はこれを私のプロジェクトのいくつかに試してみるかもしれません。 – mpen

+0

はい、ちょうど彼らのウェブサイトで読んだだけです: ''噂とは対照的に、PostSharpは実行時にSystem.Reflectionを使用しません。 " http://www.sharpcrafters.com/postsharp/performance したがって、 tは問題と思われる。 – maximpa

+0

ありがとう、私はPostSharpを見ていきます。私は特にフレームワークを使いたいとは思っていませんでしたが、代替手段がないようです。 – keyboardP

1

attributesでこれを行うことはできません。なぜなら、積極的に何かを実行していないのであれば、ランタイムによって実行されないからです。軽量のアプローチはNinject with Interceptions extensionとなりますが、それはフレームワークですが、非常に薄いアプローチであり、いずれにしても既にDIに使用している可能性があります。

もう1つのオプションがありますが、もう少し複雑なものはMEFに基づいている可能性があります。次に、属性を使用して、アクティブ化中に属性を使用できます。

1

あなたはそうです、それはAOPのように聞こえます。
あなたはコンパイル時に織り成すように聞こえますか?私。その属性はコンパイラによって追加のコードに変換されます。
あなたはこのすべてを行うためのツールやテクニックを参照してください...これを実装する方法で
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
を見ることができます。

また、AOPフレームワークを使用することもできます。 IMHO、あなたはAOPフレームワークを見るべきです。

関連する問題