2011-10-17 13 views
5

Conoscendo Castle Windsor, è possibile registrare gli aspetti (quando si utilizza l'intercettazione dei metodi in Windsor come AOP) utilizzando il codice anziché applicare gli attributi alle classi. È lo stesso possibile in Postsharp? È una preferenza, ma preferisce avere aspetti abbinati a interfacce/oggetti in un unico posto, al contrario degli attributi dappertutto.Puoi applicare aspetti in PostSharp senza utilizzare gli attributi?

Aggiornamento: Curioso se posso assegnare aspetti di interfacce/oggetti similiar a questo:

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

Se si potesse fare questo, si avrebbe la possibilità di non dover mettere gli attributi sul assemblee/classe/metodi per applicare aspetti. Posso quindi avere un codice file/classe che contiene quali aspetti sono applicati a quale classe/metodi/ecc.

risposta

3

Sì. È possibile utilizzare il multicasting (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) oppure è possibile utilizzare i provider di aspetto (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).

Esempio:

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

vi consiglio che se avete requisiti complessi per determinare quali tipi ottengono alcuni aspetti che si consideri la creazione di un provider di aspetto, invece.

+0

Questi articoli sembrano ancora applicare un attributo alla classe. Stavo osservando le linee di come Castle Does Dynamic injection: http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx. Sono solo curioso di poterlo fare con PostSharp. Poiché PostSharp tesse i loro aspetti come tempo di compilazione, può capire se non lo fa. –

+0

Cosa stai cercando di ottenere? La tua domanda afferma "È una preferenza, ma preferisce avere aspetti abbinati a interfacce/oggetti in un unico posto, al contrario di attributi dappertutto." ecco perché ho dato le risposte che ho fatto. Ora sembra che tu voglia abilitare o disabilitare aspetti in fase di esecuzione. Che cosa importa se gli aspetti vengono applicati utilizzando gli attributi? Avete problemi con il tempo di compilazione vs compilazione? –

+0

Domanda aggiornata. Fammi sapere se questo chiarisce le cose. –

1

Dai un'occhiata a LOOM.NET, lì hai un post compilatore e un runtime weaver. Con la successiva puoi archiviare esattamente quello che vuoi.

0

Dovrebbe essere possibile utilizzare PostSharp XML configuration. La configurazione XML è l'unificazione dei modelli Plug-in e Project nel caricatore di progetto.

Descrizione di .psproj può essere trovato a http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx.

Si noti che ho visto solo esempi su come i toolkit PostSharp utilizzano questa configurazione XML. Ma dovrebbe funzionare allo stesso modo per gli aspetti personalizzati.

Attenzione: ho notato che l'installazione di un kit di strumenti PostSharp da Nuget sovrascrive il file psproj esistente. Quindi non dimenticare di eseguire il backup.

Problemi correlati