2011-07-06 10 views
2

私が開始する前に、私は次のようにAOPの用語の私の現在の理解があることを明確にしたいのですが...PostSharpポイントカット

  • 側面は、OOPのクラスのAOPと同等です。
  • アドバイスは、OOPのメソッドのAOPに相当します。
  • Pointcutは、OOPで 'using'コードと同等のAOPです。 OOPでは、我々は物事を呼び出す。 AOPでは、私たちは物事を織ります。 の決定を編むここで、はPointcutsによって定義されています。実際の問題上へ、

...

私はプロパティを除く、すべての方法で(織り)を使用したいPostSharpで伐採側面を持っています。もともと私は私の側面に、次を使用していました:

[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)] 

はしかし、私は、アスペクトはまだ私は性質上で実行されるから、私のコードを排除するために、実行時に二次チェックを実行しなければならなかった意味、性質に織り込まれていましたが見つかりました:

if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) { 

これは理想的ではありません。私は私のポイントカットでこの動作を定義できるので、実行時のチェックを行う必要はありません。

私はMethodPointcut属性を調べています。この属性は、作成時にアドバイスを選択する候補者を支援するためのコールバックを提供しているようです。 例をご覧ください。

私はまだ「私のアドバイスにPointcutsをハードコーディングする必要がありますか?」と考えています。アスペクトとアドバイスは定義/実装です。 Pointcutsは使い方です。 2つは別々にする必要があります。

答えて

3

プロパティメソッドは2通りあります。 PostSharpはMSBuildがMSILにあなたのC#を変えた後に仕事をすることを忘れないでください。

あなたがしているのは、実行時にチェックするのではなく、コンパイル時にチェックすることです。 CompiletimeValidate()メソッドをオーバーライドし、そこでチェックコードを移動します。このメソッドが一致する場合は、falseを返し、それ以外の場合はtrueを返します。 PostSharpはこのメソッドを使用して、アスペクトがターゲットに適用されるかどうかを(コンパイル時に)判断します。実行時に何も起こらない。

マルチキャストを使用してこれを行うこともできます。 (いくつかの他の人と一緒に)そのhttp://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx

[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0, 
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")] 

MethodPointcutにdetialsのために、次のPostSharpプリンシパルの記事を参照してくださいは、複雑な側面のためのものです。来週は記事が出てくる。

+0

ありがとうございます。 MulticastTargets.Propertyはそれから何を識別しますか? –

+0

メソッド=コンストラクタではなくメソッドですが、プロパティはプロパティですが、メソッドではありません。 http://doc.sharpcrafters.com/postsharp/2.0/##PostSharp.chm/html/T_PostSharp_Extensibility_MulticastTargets.htm –

関連する問題