2011-10-17 9 views
5

私はCastle Windsorと知っていますが、クラスに属性を適用する代わりに、コードを使用してアスペクトを登録することができます(WindsorのAOPとしてメソッドを使用する場合)。ポストシャープでも同じことが可能ですか?それは好みのことですが、すべての属性とは対照的に、1つの場所でインターフェイス/オブジェクトに一致する側面を持つことを好みます。アトリビュートを使わずにポストシャープでアスペクトを適用できますか?

アップデート:私はこれに似インターフェース/オブジェクトに側面を割り当てることができるかどう は好奇心:

container.Register(
     Component 
     .For<IService>() 
     .ImplementedBy<Service>() 
     .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere 
    ); 

あなたがこれを行うことができれば、あなたはアセンブリ/上の属性を配置する必要がないのオプションを持っているでしょうアスペクトを適用するクラス/メソッド。次に、どのアスペクトがどのクラス/メソッド/ etcに適用されるかを含む1つのコードファイル/クラスを持つことができます。

答えて

3

はい。マルチキャスト(http://www.sharpcrafters.com/blog/post/Day-2-Applying-Aspects-with-Multicasting-Part-1.aspx、http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx)を使用することも、アスペクトプロバイダ(http: /www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1.aspx、http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-13-e28093-Aspect-Providers-e28093-Part-2.aspx)。

例:

using System; 
    using PostSharp.Aspects; 
    using PostSharp.Extensibility; 

    [assembly: PostSharpInterfaceTest.MyAspect(AttributeTargetTypes = "PostSharpInterfaceTest.Interface1", AttributeInheritance = MulticastInheritance.Multicast)] 

    namespace PostSharpInterfaceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Example e = new Example(); 
      Example2 e2 = new Example2(); 
      e.DoSomething(); 
      e2.DoSomething(); 
      Console.ReadKey(); 
     } 
    } 

    class Example : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something"); 
     } 
    } 

    class Example2 : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something else"); 
     } 
    } 

    interface Interface1 
    { 
     void DoSomething(); 
    } 

    [Serializable] 
    class MyAspect : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      Console.WriteLine("Entered " + args.Method.Name); 
     } 
    } 
} 

あなたはタイプがあなたの代わりにアスペクトプロバイダを作成することを検討特定の側面を取得決定するための複雑な要件を持っている場合、私はことをお勧めします。

+0

これらの記事はまだクラスに属性を適用しているようです。私はキャッスルがダイナミックインジェクションをどのようにしているかを見ていました:http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx。 PostSharpでこれを行うことができるのであれば私は興味があります。 PostSharpはコンパイル時の面を織り込むので、そうでない場合は理解することができます。 –

+0

あなたは何を目指していますか?あなたの質問には、「それは好みのことですが、すべての属性とは対照的に、1つの場所でインターフェイス/オブジェクトに一致する側面を持つことを好む」と述べています。それが私が答えを出した理由です。これで、実行時にアスペクトを有効または無効にしたいように思えます。属性を使用してアスペクトが適用される場合はどういう意味ですか?ランタイムとコンパイル時間の関係はありますか? –

+0

質問が更新されました。それが事をクリアすれば私に教えてください。 –

1

LOOM.NETを見ると、ポストコンパイラとランタイムウィーバーがあります。後の方で、あなたが望むものを正確にアーカイブすることができます。

0

PostSharp XML configurationを使用することができます。 XML構成は、プロジェクト・ローダー内のプラグインおよびプロジェクト・モデルの統一です。

.psprojの説明はhttp://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspxにあります。

私は、PostSharpツールキットがこのXML構成をどのように使用するかの例を見てきました。 しかし、カスタムアスペクトでも同じように動作するはずです。

警告:NugetのPostSharp Toolkitをインストールすると、既存のpsprojファイルが上書きされていました。だから、それをバックアップすることを忘れないでください。

関連する問題