2011-10-17 11 views
5

Wiem, że w Castle Windsor można rejestrować aspekty (podczas przechwytywania metod w Windsor jako AOP) za pomocą kodu zamiast stosowania atrybutów do klas. Czy to samo możliwe w Postsharp? Jest to rzeczą preferowaną, ale preferuje się, aby aspekty były dopasowane do interfejsów/obiektów w jednym miejscu, a nie do wszystkich atrybutów.Czy możesz zastosować aspekty w PostSharp bez używania atrybutów?

Aktualizacja: Ciekawy czy mogę przypisać aspekty interfejsów/obiekty podobne do tego:

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

Jeśli można to zrobić, to masz możliwość nie trzeba umieszczać atrybutów zespołów/klasa/metody stosowania aspektów. Mogę wtedy mieć jeden plik/klasę kodu, który zawiera które aspekty są stosowane do której klasy/metody/etc.

Odpowiedz

3

Tak. Możesz użyć multiemisji (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) lub możesz użyć dostawców aspektu (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).

Przykład:

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

polecam, jeśli mają złożone wymagania dotyczące określania, które rodzaje uzyskać pewne aspekty, które należy rozważyć utworzenie dostawcy zamiast obrazu.

+0

Artykuły te nadal wydają się stosować do klasy atrybut. Patrzyłem na to, jak wtrysk Castle Does Dynamic: http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx. Jestem ciekawy, czy możesz to zrobić w PostSharp. Ponieważ PostSharp splata ich aspekty jako czas kompilacji, może zrozumieć, jeśli tak nie jest. –

+0

Czego chcesz osiągnąć? Twoje pytanie brzmi: "Jest to kwestia preferencji, ale preferujemy, aby aspekty były dopasowane do interfejsów/obiektów w jednym miejscu, w przeciwieństwie do atrybutów na całym." dlatego podałem odpowiedzi, które zrobiłem. Wygląda na to, że chcesz włączać lub wyłączać aspekty w środowisku wykonawczym. Jakie ma znaczenie, czy aspekty są stosowane przy użyciu atrybutów? Czy masz wątpliwości dotyczące czasu kompilacji i kompilacji? –

+0

Zaktualizowane pytanie. Daj mi znać, jeśli to rozwiąże sprawę. –

1

Zobacz LOOM.NET, tam masz kompilator postów i tkacz runtime. Później możesz zarchiwizować dokładnie to, co chcesz.

0

Powinno być możliwe korzystanie z PostSharp XML configuration. Konfiguracja XML to ujednolicenie modeli wtyczek i projektów w module ładującym projekt.

Opis .psproj można znaleźć pod adresem http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx.

Należy zauważyć, że widziałem tylko przykłady, jak PostSharp Toolkit używa tej konfiguracji XML. Ale to powinno działać dla niestandardowych aspektów w ten sam sposób.

Ostrzeżenie: Zauważyłem, że instalacja zestawu PostSharp Toolkit z Nuget nadpisuje istniejący plik psproj. Więc nie zapomnij go wykonać.

Powiązane problemy