Question

Il y a beaucoup d'implémentation d'AOP en C #, VB.net. Voici quelques exemples d'implémentations AOP:

Quelle est la meilleure implémentation pour AOP dans .Net? Ce que je devrais utiliser?

Était-ce utile?

La solution

Je pense que le Castle Dynamic Proxy est la solution de choix si une interception dynamique peut gérer votre Besoins. Ce framework est utilisé en interne par de nombreux autres frameworks qui souhaitent offrir des fonctionnalités AOP. En général, la plupart des conteneurs IoC existants fournissent désormais des mécanismes d'interception dynamiques (Spring.NET, Castle Windsor, StructureMap, etc.). Si vous travaillez déjà avec un conteneur IoC, il serait peut-être plus facile d'examiner ce qu'il propose.

Si l'interception dynamique ne répond pas à vos besoins (tissage de classe scellée, interception d'appels non virtuels, etc.), vous souhaitez certainement un tissage statique. PostSharp est la référence dans ce domaine.

Notez qu'il existe également Linfu , qui peut être utilisé pour tirer parti des deux modes AOP.

Autres conseils

" Best " est subjectif.

Commencez par dresser une liste des fonctionnalités dont vous avez besoin, de votre architecture, etc. Ensuite, recherchez les options qui répondent à vos besoins, sans introduire de complexité inutile. Par exemple, plusieurs sont orientés interface: votre code est-il actuellement orienté interface? Sinon, PostSharp pourrait être un meilleur choix (être intégré aux classes d'origine). Mais bien sûr, PostSharp ne peut pas être configuré à l'exécution ... des chevaux pour les parcours.

La meilleure façon de faire de la programmation orientée aspect dans .NET consiste à utiliser des techniques de conception bien connues. Par exemple, en appliquant les principes SOLID , vous pouvez obtenir la flexibilité et la modularité nécessaires pour permettre l'ajout préoccupations transversales. Si vous avez le droit de conception, vous pourrez même appliquer la plupart des problèmes transversaux sans aucun cadre. C’est une erreur de penser que la POO n’est pas faite pour faire de la POA.

Voici quelques indications:

  • Ne dépendez pas d'instances concrètes, mais de l'abstraction.
  • Ne mélangez pas les problèmes transversaux et la logique métier dans une même classe.
  • Ajout de préoccupations transversales en encapsulant les classes avec la logique métier dans les classes qui implémentent ces préoccupations ( décorateurs ).
  • Recherchez des artefacts communs dans votre conception et modélisez-les de manière égale, en utilisant de préférence le même type d'abstraction. Jetez un coup d’œil à this et this par exemple.

Lorsque vous avez les bonnes abstractions en place, ajouter de nouvelles préoccupations transversales au système consiste simplement à écrire une nouvelle classe de décorateurs et à l’envelopper autour des bonnes implémentations. Si les abstractions sont génériques, vous pouvez envelopper un seul décorateur autour d’un grand groupe de classes (ce qui est exactement ce qu’est AOP).

Bien que des techniques telles que les mandataires dynamiques et le tissage de code puissent faciliter le travail avec une application mal conçue, il n’ya vraiment aucune alternative à une bonne conception. Tôt ou tard, vous vous brûlerez. Cela ne signifie pas pour autant que la génération de proxy dynamique et le tissage de code ne doivent pas être utilisés. Mais sans une conception d’application appropriée, même ces techniques ne seront que marginalement utiles.

Je ne sais pas quoi de mieux, il y a beaucoup de cadres et pas assez d'heures dans la journée pour tous les essayer.

J’ai utilisé PostSharp et j’ai été agréablement surpris de la facilité avec laquelle il est facile de commencer.

J'ai également examiné AOP avec Castle Windsor et Spring.Net, l'approche est différente (durée d'exécution vs durée de compilation). Mélanger AOP et IoC semble avoir du sens. Si vous n’utilisez pas l’un de ces frameworks, c’est beaucoup plus de travail à faire, mais ne vous laissez pas arrêter.

Pour les nouveaux projets, j'utiliserais probablement Castle Windsor, mais c’est surtout parce que je voudrais aussi utiliser IoC. Si je devais rapidement implémenter AOP dans une base de code existante, j'utiliserais PostSharp.

Il existe également une injection de stratégie et des Interception entre Unity de Microsoft.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top