2009-03-11 12 views
71

Hay una gran cantidad de implementación de AOP en C#, VB.net. Esto es parte de AOP Implementaciones:¿Cuál es la mejor implementación para AOP en .Net?

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

+4

Sería útil si proporcionara enlaces a todo el AOP, a fin de ahorrarle al lector un poco de tiempo con Google. Espero que esta pregunta/respuestas se convierta en un gran resumen de las diferentes opciones de AOP en .NET –

+9

52 personas votaron que es una pregunta constructiva. 5 votaron que no es constructivo. ¿Quién decidió? Al menos el moderador debería cambiar o reformular la pregunta, pero sería mejor considerar la opinión de la mayoría de la gente. – Revious

+2

@Revious Totalmente de acuerdo! – Legends

Respuesta

38

Creo que Castle Dynamic Proxy es la solución de elección 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 dinámicos 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 intercepción dinámica no puede satisfacer sus necesidades (entrelazar la clase sellada, interceptar llamadas no virtuales, etc.), entonces ciertamente desea el entrelazado 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 AOP.

+2

+1 en eso si quieres hacer AOP en tiempo de ejecución. +1 en PostSharp si desea tiempo de compilación posterior AOP –

+0

¿Alguna actualización de esta respuesta? ¿O esto todavía es válido? Me preguntaba especialmente cómo es Spring.Aop se compara con Castle y PostSharp –

+1

desafortunadamente, PostSharp es un producto comercial – pixel

12

"Mejor" es subjetivo.

Primero, elabore una lista de las características que necesita, su arquitectura, etc. Luego busque las opciones que hacen lo que necesita, sin introducir una complejidad innecesaria. Por ejemplo, varios están orientados a la interfaz: ¿su código actualmente está 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.

+0

podrías reformular lo que dijiste de la siguiente manera: "Lo mejor es subjetivo, elaboraré una lista de los pro y los contros para algo de este marco". – Revious

4

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 empezar a usarlo.

También busqué en AOP con Castle Windsor y Spring.Net, el enfoque es diferente (tiempo de ejecución frente a tiempo de compilació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.

11

La mejor manera de hacer una programación orientada a aspectos en .NET es mediante el uso de técnicas de diseño bien conocidas. Por ejemplo, al aplicar el SOLID principles 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.

Éstos son algunos consejos:

  • no dependen de casos concretos, sino que dependen de las 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 negocio en las clases que implementan esas preocupaciones (decorators).
  • Encuentra artefactos comunes en tu diseño y ejemplifícalos por igual, preferiblemente usando el mismo tipo de abstracciones. Eche un vistazo a this y this por ejemplo.

Cuando tiene 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 dinámicos 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.

+0

AOP es el próximo nivel de abstracción. De hecho, es la limitación de la herencia y la composición lo que conduce a AOP. ¿Has visto el bloque de excepción Entlib? Aspect es mucho más limpio que invocar ese maldito bloque para cada llamada a la base de datos, solo para probar-atrapar-registrar-lanzar. –

+2

Si ajusta cada llamada a su base de datos con un bloque de excepciones, lo está haciendo mal de todos modos. Vuelve a un buen diseño. Siempre. – Steven

+0

Entonces, en lugar de atrapar excepciones db ¿cuál es la forma correcta? – OutOFTouch

Cuestiones relacionadas