2009-08-20 16 views
0

基本的には、C#で貧しい人のアスペクト指向プログラミングを実装しようとしています。私はContextAttributeの使用について考えていましたが、クラスレベルでのみバインドされているようです。それは、注釈を付けるメソッドと同じパラメータを受け取るような属性を置くことができますか、またはそれが起動されたコンテキストにアクセスするための何らかの方法はありますか?C#で属性コンテキストを取得する

私は、私は私はあなたのソリューションは、のようになります正確にどのように

[Validated] 
public void AddUser(User user) 
{ 
    users.Add(user); 
} 

答えて

2

私はあなたが3番目のコンポーネントを欠いていると思います。ほとんどのAOP実装(例えば、Aspect#)は、実際にコードを実行するためにプロキシまたはインターセプタに依存しています。あなたのシナリオでは、1)メソッド上に属性が存在することを知り、2)属性内のコードを実行するのに必要なメカニズムを起動する(またはなるように)必要なコンポーネントが不足しています。

幸運なことに、オープンソースでは既に多数の(かなり公正な)ソリューションが利用可能です。私が考えることができる最も単純なオプションは、PostSharpのようなコンパイル時のウィーバーを使うことです。そのコピーを手に入れてください。サンプルには、あなたがやろうとしていることのいくつかの例があります(OnMethodInvocationAspectに興味があります)。

最終的には、提供したサンプルとまったく同じように見えますが、希望のコードも実行されています。

+0

+1 PostSharp –

+0

これは完璧です。私は、C#のためのアスペクトウィーバーがどこかに読めなかったことを理解できませんでした。私はpostsharpがhttp://zombo.comから出てきて、不可能なことが起こっていると思います。 – stimms

+0

ちょうど、PostSharpに付属のプラグインを見てください。 Log4postsharp(log4netとpostsharpと結婚する)はLog(]属性として渡されます。この属性はメソッドへのエントリ/終了を渡します(渡されたすべてのパラメータとその値を反映します)!どのようなバリデーションをしたいのであれば、そのコードを書き換えることができます。間違いなく時間を節約できます... –

1

のようなものを知ってはいけないしていた最初の3行を抽出したいと思い、そこからこのコード

public void AddUser(User user) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(user); 
    if (errors.Any()) 
      throw new RulesException(errors); 
    users.Add(user); 
} 

を持っていますC#の属性では、(私が知る限り)それらを要求しない限り、コードを実行しません。また、属性を問い合せると、コンテキストも取得されます。私の意見では、あなたの戦略には何か問題があります。

関連する問題