2011-10-17 21 views
5

Castle Windsor ile biliyorum, sınıflara öznitelikleri uygulamak yerine kod kullanarak yönlerini (Windsor'da AOP olarak yöntem durdurmayı kullanırken) kaydedebilirsiniz. Aynı Postharp'ta mümkün mü? Bu bir tercih meselesidir, ancak her yerin özniteliklerinin aksine, tek bir yerde arayüzler/nesnelerle eşleşen yönlere sahip olmayı tercih eder.PostSharp'taki özellikleri nitelik kullanmadan uygulayabilir misiniz?

Güncelleme: Ben arayüzlerine yönlerini atayabilirsiniz eğer Meraklı/nesneler buna benzer : Bunu olsaydı

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

, sen derlemeler özelliklerini yerleştirmek zorunda DEĞİL seçeneği olurdu/yönleri uygulamak için sınıf/yöntemler. Daha sonra hangi yönlerin hangi sınıfa/yöntemlere/etc'ye uygulanacağını içeren bir kod dosyasına/sınıfına sahip olabilirim.

cevap

3

Evet. Çoklu yayın kullanabilir (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) veya yön sağlayıcıları kullanabilirsiniz (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).

Örnek:

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

ben tavsiye ederiz türleri yerine boy sağlayıcı oluşturma düşünün belirli yönlerini almak belirlemek için karmaşık gereksinimleri varsa.

+0

Bu makalelerde, yine de sınıf için bir öznitelik geçerli görünüyor. Castle'ın Dinamik Enjeksiyon Nasıl Yaptığını Çizerken: http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx. PostSharp ile bunu yapabilirsen merak ediyorum. PostSharp kendi yönlerini derleme zamanı olarak ele aldığından bu yana olmadığını anlayabilir. –

+0

Neye ulaşmak istiyorsunuz? Sorunuz "Bu bir tercih meselesidir, ancak her yerde özniteliklerin aksine, tek bir yerde arayüzler/nesnelerle eşleşen yönlere sahip olmayı tercih eder." Bu yüzden yaptığım cevapları verdim. Şimdi, çalışma zamanında yönleri etkinleştirmek veya devre dışı bırakmak istediğiniz gibi geliyor. Özellikler nitelikler kullanılarak uygulanırsa ne fark eder? Çalışma zamanı ve derleme zamanı ile ilgili endişeleriniz var mı? –

+0

Güncel soru. Bir şeyleri temizlerse haber ver. –

1

LOOM.NET'e bir göz atın, orada bir derleyiciniz ve bir çalışma zamanı dokumacınız var. Daha sonra, tam olarak ne istediğinizi arşivleyebilirsiniz.

0

PostSharp XML configuration kullanmak mümkün olmalıdır. XML yapılandırması, proje yükleyicide Eklenti ve Proje modellerinin birleşimidir.

.psproj açıklaması http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx adresinde bulunabilir.

Not, sadece PostSharp Toolkit'lerinin bu XML yapılandırmasını nasıl kullandığını gördüm. Ama aynı şekilde özel yönleri için çalışmalıdır.

Uyarı: Nuget'ten bir PostSharp Toolkit yüklemesinin varolan psproj dosyasının üzerine yazıldığını fark ettim. Bu yüzden yedeklemeyi ihmal etmeyin.