90 votes

Quelle est la meilleure mise en œuvre de la POA en .Net ?

Il y a beaucoup d'implémentations de la POA en C#, VB.net. Voici quelques implémentations de la POA :

Quelle est la meilleure implémentation de la POA en .Net ? Que devrais-je utiliser ?

4 votes

Il serait utile que vous fournissiez des liens vers tous les AOP, afin d'épargner au lecteur un peu de temps avec Google. J'espère que cette question/réponse deviendra un excellent résumé des différentes options de la POA dans .NET.

11 votes

52 personnes ont voté que c'était une question constructive. 5 ont voté que ce n'était pas constructif. Qui a décidé ? Le modérateur devrait au moins modifier ou reformuler la question, mais il ferait mieux de prendre en compte l'opinion de la plupart des participants.

2 votes

@Revious Totalement d'accord !

48voto

Romain Verdier Points 8699

Je pense que Castle Dynamic Proxy est la solution de choix si l'interception dynamique peut répondre à vos besoins. Ce framework est utilisé en interne par beaucoup d'autres frameworks qui veulent offrir des capacités AOP. Typiquement, la plupart des conteneurs IoC existants fournissent maintenant des mécanismes d'interception dynamique (Spring.NET, Castle Windsor, StructureMap, etc.) Si vous travaillez déjà avec un conteneur IoC, il serait peut-être plus facile de regarder ce qu'il propose.

Si l'interception dynamique ne peut pas répondre à vos besoins (tissage de classe scellée, interception d'appel non-virtuel, etc.), alors vous voulez certainement un tissage statique. PostSharp est la référence dans ce domaine.

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

3 votes

+1 pour cela si vous voulez faire de l'AOP runtime. +1 sur PostSharp si vous voulez faire de la POA post-compilation.

0 votes

Des nouvelles de cette réponse ? Ou est-elle toujours valable ? Je me demandais surtout comment Spring.Aop se compare à Castle et PostSharp.

2 votes

Malheureusement, PostSharp est un produit commercial

15voto

Marc Gravell Points 482669

"Meilleur" est subjectif.

Tout d'abord, dressez 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 d'entre elles sont orientées vers l'interface : est-ce que votre code actuellement orienté vers l'interface ? Si non, PostSharp pourrait être un meilleur choix (étant tissé dans les classes originales). Mais bien sûr, PostSharp ne peut pas être configuré à l'exécution... des chevaux pour les cours.

1 votes

Vous pourriez reformuler ce que vous avez dit comme suit : "Le meilleur est subjectif, je vais dresser une liste des avantages et inconvénients de certains de ces cadres".

11voto

Steven Points 56939

La meilleure façon de faire de la programmation orientée aspect dans .NET est d'utiliser des techniques de conception bien connues. Par exemple, en appliquant le Principes SOLIDES vous pouvez atteindre la flexibilité et la modularité dont vous avez besoin pour permettre l'ajout de préoccupations transversales. Si la conception est bonne, vous serez même en mesure d'appliquer la plupart des préoccupations transversales sans aucun cadre. C'est une erreur de penser que la POO n'est pas adaptée à la POA.

Voici quelques conseils :

  • Ne dépendez pas des instances concrètes, mais dépendez des abstractions.
  • Ne mélangez pas les préoccupations transversales et la logique métier dans la même classe.
  • Ajouter des préoccupations transversales en enveloppant les classes avec une logique d'entreprise dans des classes qui mettent en œuvre ces préoccupations ( décorateurs ).
  • Trouvez les artefacts communs dans votre conception et modélisez-les de la même manière, de préférence en utilisant le même type d'abstractions. Jetez un coup d'œil à este y este par exemple.

Lorsque les bonnes abstractions sont en place, l'ajout de nouvelles préoccupations transversales au système se résume à l'écriture d'une nouvelle classe décoratrice et à son intégration dans les bonnes implémentations. Si les abstractions sont génériques, vous pouvez envelopper un décorateur unique autour d'un grand groupe de classes (ce qui est exactement le but de la POA).

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'y a pas vraiment d'alternative à une bonne conception. Tôt ou tard, vous vous brûlerez. Cela ne signifie pas que la génération de proxy dynamique et le tissage de code ne doivent pas être utilisés. Mais sans une conception correcte de l'application, même ces techniques ne seront que marginalement utiles.

2 votes

La POA est le niveau d'abstraction suivant. En fait, c'est la limitation de l'héritage et de la composition qui conduit à la POA. Avez-vous vu le bloc d'exception d'Entlib ? Aspect est beaucoup plus propre que d'invoquer ce satané bloc pour chaque appel à la base de données, juste pour essayer d'attraper et de lancer le journal.

2 votes

Si vous enveloppez chaque appel à votre base de données d'un bloc d'exception, vous vous y prenez mal de toute façon. On en revient à une bonne conception. Toujours.

0 votes

Au lieu d'attraper les exceptions de la base de données, quelle est la bonne méthode ?

5voto

Mendelt Points 21583

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

J'ai utilisé PostSharp et j'ai été agréablement surpris de la facilité avec laquelle on peut s'y mettre.

J'ai également étudié la POA avec Castle Windsor et Spring.Net, l'approche est différente (temps d'exécution vs temps de compilation). Mélanger la POA et l'IoC semble avoir du sens. Si vous n'utilisez pas encore l'un de ces frameworks, il vous faudra beaucoup plus de travail pour vous lancer, mais que cela ne vous arrête pas.

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

4voto

Grigori Melnik Points 2676

Il y a aussi l'injection de politiques et Interception de l'unité de Microsoft.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X