Pregunta

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é debería usar?

¿Fue útil?

Solución

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

Si la intercepción dinámica no puede satisfacer sus necesidades (entrelazar clases selladas, interceptar llamadas no virtuales, etc.), entonces seguramente querrá entrelazar estática. PostSharp es la referencia en este dominio.

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

Otros consejos

" 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 está actualmente orientado a la interfaz? De lo contrario, PostSharp podría ser una mejor opción (ser entretejido 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 programación orientada a aspectos en .NET es usar técnicas de diseño bien conocidas. Por ejemplo, al aplicar los principios SOLID 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 de abstracciones.
  • No mezcle las preocupaciones transversales y la lógica empresarial en la misma clase.
  • Agregar inquietudes transversales envolviendo clases con lógica de negocios en clases que implementan esas inquietudes ( decoradores ).
  • Encuentra artefactos comunes en tu diseño y modela por igual, preferiblemente usando el mismo tipo de abstracciones. Eche un vistazo a this y esto por ejemplo.

Cuando tenga 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 proxys 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 la generación de proxy dinámico y el tejido de código no deberían usarse. 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é en AOP con Castle Windsor y Spring.Net, el enfoque es diferente (tiempo de ejecución versus tiempo de compilación). Mezclar AOP e IoC parece tener sentido. Cuando todavía no está utilizando uno de estos marcos, es mucho más trabajo comenzar, pero no permita que eso lo detenga.

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

También hay Inyección de políticas e Intercepción de unidad de Microsoft.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top