¿Cuál es la mejor implementación para AOP en .Net?

Hay una gran cantidad de implementación de AOP en C #, VB.net. esta es una de las implementaciones de AOP:

  • PostSharp
  • LOOM.NET
  • Aspect.NET
  • Bloque de aplicaciones de inyección de directivas de Enterprise Library 3.0
  • AspectDNG
  • DotSpect (.SPECT)
  • Spring.NET Framework como parte de su funcionalidad
  • Wicca y Phx.Morph
  • Un análisis exhaustivo de las soluciones AOSD para .NET está disponible en Twente University
  • Seasar.NET
  • Aspecto#
  • Puzzle.NAspect
  • Componer*
  • Punto fijo
  • NConcern .NET AOP Framework

¿Cuál es la mejor implementación para AOP en .Net? ¿Qué debería usar?

Creo que Castle Dynamic Proxy es la solución preferida si la interceptación dinámica puede satisfacer sus necesidades. Este marco es utilizado internamente por muchos otros marcos que desean ofrecer capacidades de AOP. Normalmente, la mayoría de los contenedores existentes de IoC ahora proporcionan algunos mecanismos dynamics de interceptación (Spring.NET, Castle Windsor, StructureMap, etc.) Si ya trabaja con un contenedor IoC, tal vez sería más fácil ver lo que propone.

Si la interceptación dinámica no puede satisfacer sus necesidades (entrelazar una clase sellada, interceptar una llamada no virtual, etc.), entonces ciertamente desea un tejido estático. PostSharp es la referencia en este dominio.

Tenga en cuenta que también existe Linfu , que se puede utilizar para aprovechar ambas modas de AOP.

“Lo mejor” es subjetivo.

Primero, elabore una lista de las características que necesita, su architecture, etc. Luego, busque opciones que hagan lo que necesita, sin introducir una complejidad innecesaria. Por ejemplo, varios están orientados a la interfaz: ¿su código está actualmente orientado a la interfaz? De lo contrario, PostSharp podría ser una mejor opción (ser tejido en las clases originales). Pero, por supuesto, PostSharp no se puede configurar en tiempo de ejecución … caballos para cursos.

La mejor manera de hacer progtwigción orientada a aspectos en .NET es mediante el uso de técnicas de diseño bien conocidas. Por ejemplo, al aplicar los principios SÓLIDOS puede lograr la flexibilidad y la modularidad que necesita para permitir agregar preocupaciones transversales. Si tiene el diseño correcto, incluso podrá aplicar la mayoría de las preocupaciones transversales sin ningún marco. Es una falacia pensar que OOP no es adecuado para hacer AOP.

Aquí hay algunos consejos:

  • No dependas de instancias concretas, sino que dependas de abstracciones.
  • No mezcle las preocupaciones transversales y la lógica comercial en la misma clase.
  • Agregando preocupaciones transversales envolviendo las clases con la lógica de negocios en las clases que implementan esas preocupaciones ( decoradores ).
  • Encuentra artefactos comunes en tu diseño y ejemplifícalos por igual, preferiblemente usando el mismo tipo de abstracciones. Eche un vistazo a esto y esto, por ejemplo.

Cuando tienes las abstracciones correctas en su lugar, agregar nuevas preocupaciones transversales al sistema es solo una cuestión de escribir una nueva clase de decorador y envolverlo en las implementaciones correctas. Si las abstracciones son genéricas, puede envolver a un solo decorador en un gran grupo de clases (que es exactamente de lo que se trata AOP).

Aunque técnicas como los proxies dynamics y el tejido de códigos podrían facilitar el trabajo con una aplicación mal diseñada, no existe realmente ninguna alternativa para un buen diseño. Tarde o temprano te quemarás. Esto no significa que la generación dinámica de proxy y el tejido de código no se deben utilizar. Pero sin un diseño de aplicación adecuado, incluso esas técnicas serán marginalmente útiles.

No sé cuál es el mejor, hay muchos marcos y no hay suficientes horas en el día para probarlos todos.

Utilicé PostSharp y me sorprendió gratamente lo fácil que es comenzar a usarlo.

También busqué AOP con Castle Windsor y Spring.Net, el enfoque es diferente (tiempo de ejecución frente a tiempo de comstackción). La combinación de AOP e IoC parece tener sentido. Cuando no está utilizando uno de estos marcos todavía es mucho más trabajo para comenzar, pero no deje que eso lo detenga.

Para nuevos proyectos ahora probablemente usaría Castle Windsor, pero eso es principalmente porque también quisiera usar IoC. Si tuviera que implementar rápidamente el AOP en una base de código existente, usaría PostSharp.

También hay Inyección de política e intercepción de unidad de Microsoft.