Domanda

C'è molta implementazione AOP in C #, VB.net. queste sono alcune implementazioni AOP:

Qual è la migliore implementazione per AOP in .Net? Cosa dovrei usare?

È stato utile?

Soluzione

Penso che Castle Dynamic Proxy è la soluzione di scelta se l'intercettazione dinamica può gestire il tuo esigenze. Questo framework è utilizzato internamente da molti altri framework che vogliono offrire funzionalità AOP. In genere, la maggior parte dei contenitori IoC esistenti ora fornisce alcuni meccanismi di intercettazione dinamica (Spring.NET, Castle Windsor, StructureMap, ecc.) Se si lavora già con un contenitore IoC, forse potrebbe essere più semplice esaminare ciò che propone.

Se l'intercettazione dinamica non è in grado di soddisfare le tue esigenze (tessitura di classi sigillate, intercettazione di chiamate non virtuali, ecc.), allora sicuramente vorrai tessere statiche. PostSharp è il riferimento in questo dominio.

Nota che esiste anche Linfu , che può essere utilizzato per sfruttare entrambe le mode AOP.

Altri suggerimenti

" Migliore " è soggettivo.

Per prima cosa, elabora un elenco delle funzionalità di cui hai bisogno, la tua architettura, ecc. Quindi cerca le opzioni che fanno ciò di cui hai bisogno, senza introdurre complessità inutili. Ad esempio, molti sono orientati all'interfaccia: il tuo codice è attualmente orientato all'interfaccia? In caso contrario, PostSharp potrebbe essere una scelta migliore (essendo intessuto nelle classi originali). Ma ovviamente PostSharp non può essere configurato in fase di esecuzione ... cavalli per corsi.

Il modo migliore per eseguire una programmazione orientata all'aspetto in .NET è utilizzare tecniche di progettazione ben note. Ad esempio, applicando i principi SOLID puoi ottenere la flessibilità e la modularità necessarie per consentire l'aggiunta preoccupazioni trasversali. Se hai il design giusto, sarai anche in grado di applicare la maggior parte delle preoccupazioni trasversali senza alcun quadro. È un errore pensare che OOP non sia adatto per fare AOP.

Ecco alcuni suggerimenti:

  • Non dipendere da istanze concrete, ma dipendere da astrazioni.
  • Non mescolare preoccupazioni trasversali e logica aziendale nella stessa classe.
  • Aggiunta di preoccupazioni trasversali avvolgendo le classi con la logica aziendale nelle classi che implementano tali preoccupazioni ( decoratori ).
  • Trova artefatti comuni nel tuo design e modellali equamente, preferibilmente usando lo stesso tipo di astrazioni. Dai un'occhiata a this e questo per esempio.

Quando hai messo a punto le astrazioni giuste, aggiungere nuove preoccupazioni trasversali al sistema è solo una questione di scrivere una nuova classe di decoratori e avvolgerla attorno alle giuste implementazioni. Se le astrazioni sono generiche, puoi avvolgere un singolo decoratore attorno a un folto gruppo di classi (che è esattamente ciò di cui parla AOP).

Sebbene tecniche come i proxy dinamici e la tessitura del codice potrebbero rendere più semplice il lavoro con un'applicazione mal progettata, non esiste davvero alcuna alternativa per una buona progettazione. Prima o poi verrai bruciato. Ciò non significa che la generazione dinamica del proxy e la tessitura del codice non debbano essere utilizzate. Ma senza una corretta progettazione dell'applicazione anche quelle tecniche saranno solo marginalmente utili.

Non so del meglio, ci sono molti framework e non abbastanza ore al giorno per provarli tutti.

Ho usato PostSharp e sono rimasto piacevolmente sorpreso da quanto sia facile iniziare con esso.

Ho anche esaminato AOP con Castle Windsor e Spring.Net, l'approccio è diverso (tempo di esecuzione vs tempo di compilazione). Mischiare AOP e IoC sembra avere senso. Quando non stai usando uno di questi framework, è ancora molto più lavoro per iniziare, ma non lasciarti fermare.

Per i nuovi progetti ora probabilmente userò Castle Windsor, ma principalmente perché vorrei anche usare l'IoC. Se dovessi implementare rapidamente AOP in una base di codice esistente userei PostSharp.

C'è anche Policy Injection e Unity Interception da Microsoft.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top