14

独自の実装を続行する前に、すべて同じ機能を実行する必要があるさまざまな個別のメソッドがあります。これで、これらの関数を各メソッドに実装できましたが、これを悪用する方法があるかどうか疑問に思ってattributesいましたか? 非常に単純な例として、すべてのネットワーク呼び出しでネットワーク接続を確認する必要があります。

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

IsNetworkConnectedこれは機能しますが、ネットワークを使用するメソッドごとにメソッドを呼び出して、個別に処理する必要があります。代わりに、私はこれをしたいです

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

ネットワークが利用できない場合は、代わりにエラー メソッドが呼び出さGetPageれて無視されます。それ以外の場合は、GetPageが呼び出されます。

これはアスペクト指向プログラミングに非常によく似ていますが、いくつかの呼び出しに対してフレームワーク全体を実装したくはありません。これは実装というよりも学習演習であるため、このようなものをどのように実装するのが最適かについて興味がありました。

4

3 に答える 3

3

PostSharpを使用できます。これは .NET 用のアスペクト指向フレームワークであり、非常に使いやすいようです。

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

Method-Level Aspects機能は、無料版で利用できます: http://www.sharpcrafters.com/purchase/compare

実行時のパフォーマンス:

PostSharp はコンパイラ テクノロジであるため、コストのかかる作業のほとんどはビルド時に行われるため、アプリケーションをすばやく起動して実行することができます。コードを生成するとき、PostSharp は、仮想メソッドの呼び出しまたは静的フィールドの取得が高価な操作であると想定します。噂に反して、PostSharp は実行時に System.Reflection を使用しません。 http://www.sharpcrafters.com/postsharp/performance

于 2012-11-04T00:40:08.103 に答える
1

attributesアクティブに何かをしていない場合、ランタイムによって実行されないため、only でこれを行うことはできないと思います。軽量なアプローチはNinject with Interceptions extensionです。これはフレームワークですが、非常に薄いものであり、とにかく DI に既に使用している可能性があります。

別のオプションですが、もう少し複雑ですが、MEFに基づくことができます。これにより、属性を使用して、アクティブ化中に属性を使用して何かを行うことができます。

于 2012-11-04T00:17:08.830 に答える
1

そうです、AOP によく似ています。
あなたが求めているのは、コンパイル時の織り込みのように聞こえますか? つまり、属性はコンパイラによって追加のコードに変換されます。
これを実装する方法を見ることができます...
カスタム属性を使用して追加のコードを生成する
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/ compiletime-weaving
はすべて、これを行うためのツールとテクニックを参照しています。

または、AOP フレームワークを使用することもできます。IMHO、AOP フレームワークを確認する必要があります。

于 2012-11-04T00:31:01.057 に答える