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

83

Hay mucha implementación de AOP en C #, VB.net. estas son algunas de las implementaciones de AOP:

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

ecleel
fuente
4
Sería útil si proporcionara enlaces a todos los AOP, para 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
Ian Ringrose
10
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 es mejor que considere la opinión de la mayoría de la gente.
Anterior
2
@Revious ¡Totalmente de acuerdo!
Leyendas
1
Es asombroso que SO y la gente rechace preguntas como esta como OT. Una pregunta y una tecnología tan útil para discutir y ayudar a la comunidad simplemente se rechaza y se cierra, pero un grupo de personas anticuadas al estilo de los 80 que están atrapadas en el pasado. Entonces, el mundo ha cambiado. Es completamente comprensible que desee ayudar a responder preguntas específicas, pero al menos proporcione un enlace en su etiqueta "cerrada" donde publicar tales preguntas. Eso ayudaría mucho y evitaría este tipo de estupideces.
píxel

Respuestas:

45

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

Si la interceptación dinámica no puede satisfacer sus necesidades (tejer una clase sellada, interceptar llamadas no virtuales, etc.), entonces sin duda 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.

Romain Verdier
fuente
3
+1 en eso si quieres hacer AOP en tiempo de ejecución. +1 en PostSharp si desea tiempo de compilación posterior AOP
Krzysztof Kozmic
¿Alguna actualización sobre esta respuesta? ¿O sigue siendo válido? Me preguntaba especialmente cómo se compara Spring.Aop con Castle y PostSharp
Evren Kuzucuoglu
1
desafortunadamente, PostSharp es un producto comercial
píxel
Postsharp es un producto comercial, no gratuito. Aconseje cualquier otra cosa para el tejido estático.
Shivam Sachan
@ShivamSachan Solo porque algo sea gratis no lo hace bueno. La mayoría de los AOP gratuitos en .net murieron con las últimas actualizaciones hace 2-5 años, PostSharp sigue siendo el mejor de su clase.
Offler
15

"Lo mejor" es subjetivo.

Primero, elabore una lista de las características que necesita, su arquitectura, 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 actualmente está orientado a la interfaz? Si no es así, PostSharp podría ser una mejor opción (incorporarse a las clases originales). Pero, por supuesto, PostSharp no se puede configurar en tiempo de ejecución ... caballos para cursos.

Marc Gravell
fuente
podría reformular lo que dijo de la siguiente manera: "Lo mejor es subjetivo, haré una lista de los pros y los contros para algunos de este marco".
Anterior
11

La mejor manera de hacer programación orientada a aspectos en .NET es utilizando técnicas de diseño bien conocidas. Por ejemplo, al aplicar los principios SOLID puede lograr la flexibilidad y 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 la POO no es adecuada para hacer AOP.

Aquí hay algunos consejos:

  • No dependa de instancias concretas, sino que dependa de abstracciones.
  • No mezcle preocupaciones transversales y lógica empresarial en la misma clase.
  • Agregar preocupaciones transversales al envolver clases con lógica de negocios en clases que implementan esas preocupaciones ( decoradores ).
  • Encuentre artefactos comunes en su diseño y modele por igual, preferiblemente usando el mismo tipo de abstracciones. Mire esto y esto, 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 envolverla en las implementaciones correctas. Si las abstracciones son genéricas, puede envolver un solo decorador alrededor de un gran grupo de clases (que es exactamente de lo que se trata AOP).

Aunque las técnicas como los proxies dinámicos y el tejido de código podrían facilitar el trabajo con una aplicación mal diseñada, realmente no hay alternativa para un buen diseño. Tarde o temprano te quemarás. Sin embargo, esto no significa que no se deba utilizar la generación dinámica de proxy y el tejido de código. Pero sin un diseño de aplicación adecuado, incluso esas técnicas serán de utilidad marginal.

Steven
fuente
AOP es el siguiente 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 de Entlib? Aspect es mucho más limpio que invocar ese maldito bloque para cada llamada a la base de datos, solo para try-catch-log-throw.
Sleeper Smith
2
Si envuelve cada llamada a su base de datos con un bloque de excepción, lo está haciendo mal de todos modos. Vuelve al buen diseño. Siempre.
Steven
Entonces, en lugar de detectar excepciones de base de datos, ¿cuál es la manera correcta?
OutOFTouch
2
@OutOFTouch: Eche un vistazo a la respuesta de esta pregunta SO .
Steven
2
@SleeperSmith: aunque no estoy seguro de lo que significa "AOP es el siguiente nivel de abstracción", creo que no se pueden mantener grandes sistemas sin el uso de AOP. Creo en aplicar AOP. Sin embargo, AOP es un paradigma; no es una herramienta. Estoy de acuerdo con la limitación de la herencia, pero no es una limitación de composición lo que conduce a AOP. Es la falta de un diseño adecuado lo que lleva al uso de herramientas de proxy dinámico y tejido de código. Aplico inquietudes transversales utilizando decoradores. Esta es mi forma preferida de aplicar AOP.
Steven
5

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

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

También miré 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 aún no está utilizando uno de estos marcos, es mucho más trabajo comenzar, pero no deje que eso lo detenga.

Para nuevos proyectos, probablemente usaría Castle Windsor, pero eso se debe principalmente a que también me gustaría usar IoC. Si tuviera que implementar rápidamente AOP en una base de código existente, usaría PostSharp.

Mendelt
fuente