Estoy considerando utilizar el marco de trabajo de Postsharp para aliviar la carga del registro del método de aplicación. Básicamente, me permite adornar métodos con el atributo de registro y en tiempo de compilación inyecta el código de registro necesario en el il. Me gusta esta solución ya que mantiene el ruido alejado del entorno del código de tiempo deignar. ¿Alguna idea, experiencia o mejores alternativas?PostSharp - il weaving - thoughts
Respuesta
Aplico el registro con AOP usando Castle Windsor DynamicProxies. Ya estaba usando Castle para su contenedor IoC, así que usarlo para AOP fue el camino de menor resistencia para mí. Si desea más información, hágamelo saber, estoy en el proceso de poner en orden el código para liberarlo como una entrada en el blog
Editar
Ok, aquí está el código intercepter básica, faily básico, pero lo hace todo Necesito. Hay dos interceptadores, uno registra todos y el otro le permite definir nombres de métodos para permitir un registro de grano más fino. Esta solución depende faily en el castillo de Windsor clase
Resumen Base
namespace Tools.CastleWindsor.Interceptors
{
using System;
using System.Text;
using Castle.Core.Interceptor;
using Castle.Core.Logging;
public abstract class AbstractLoggingInterceptor : IInterceptor
{
protected readonly ILoggerFactory logFactory;
protected AbstractLoggingInterceptor(ILoggerFactory logFactory)
{
this.logFactory = logFactory;
}
public virtual void Intercept(IInvocation invocation)
{
ILogger logger = logFactory.Create(invocation.TargetType);
try
{
StringBuilder sb = null;
if (logger.IsDebugEnabled)
{
sb = new StringBuilder(invocation.TargetType.FullName).AppendFormat(".{0}(", invocation.Method);
for (int i = 0; i < invocation.Arguments.Length; i++)
{
if (i > 0)
sb.Append(", ");
sb.Append(invocation.Arguments[i]);
}
sb.Append(")");
logger.Debug(sb.ToString());
}
invocation.Proceed();
if (logger.IsDebugEnabled && invocation.ReturnValue != null)
{
logger.Debug("Result of " + sb + " is: " + invocation.ReturnValue);
}
}
catch (Exception e)
{
logger.Error(string.Empty, e);
throw;
}
}
}
}
registro completo Implemnetation
namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Logging;
public class LoggingInterceptor : AbstractLoggingInterceptor
{
public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory)
{
}
}
}
método de registro
namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Interceptor;
using Castle.Core.Logging;
using System.Linq;
public class MethodLoggingInterceptor : AbstractLoggingInterceptor
{
private readonly string[] methodNames;
public MethodLoggingInterceptor(string[] methodNames, ILoggerFactory logFactory) : base(logFactory)
{
this.methodNames = methodNames;
}
public override void Intercept(IInvocation invocation)
{
if (methodNames.Contains(invocation.Method.Name))
base.Intercept(invocation);
}
}
}
Hola Sé genial si pudieras dar una demostración rápida: ¿funciona con los atributos de los métodos? – redsquare
No me entusiasma usar Attribute para tratar con conceptos transversales como el registro, la validación, etc. Utilizo una DSL externa basada en Boo para configurar IoC Container y asignar el registro allí. Esto significa que puedo agregar/eliminar el registro sin cambiar C# –
gracias por la respuesta rápida. Siento que entraré en un mundo de configuración de xml que introduce Castle y IOC solo para iniciar sesión. – redsquare
Lo he usado para hacer exactamente esto. ¡Funciona genial! ¡Lo recomiendo encarecidamente!
Hola Joel, cualquier consejo o truco o tienes que tener cuidado con – redsquare
+1 en postsharp. He estado usando varias cosas (incluidos algunos intentos de agregar condiciones previas y posteriores al código C#) y no sé cómo lo haría sin él ...
Depende en cierta medida del tiempo que tenga. desarrollar y apoyar el proyecto para. Claro, IL weaving es una buena tecnología, pero ¿qué sucede si el formato de metadatos IL y/o conjunto cambia de nuevo (como lo hizo entre 1.1 y 2.0) y esos cambios hacen que la herramienta sea incompatible con el nuevo formato.
Si depende de la herramienta, le impide actualizar su tecnología hasta que la herramienta la admita. Sin garantías sobre esto (o incluso que el desarrollo continuará, aunque parece probable) entonces sería muy cauteloso sobre su uso en un proyecto a largo plazo.
A corto plazo, no hay problema.
Gran punto Greg. Gracias – redsquare
Dado que PostSharp es de código abierto, el desarrollo puede/continuará mientras dependas de él. –
Eso es cierto en teoría, pero desafortunadamente la teoría y la práctica no son siempre las mismas. NDoc es de código abierto, y una vez fue próspero, pero ahora yace inactivo. Los proyectos de fuente abierta aún necesitan una comunidad a su alrededor, y si usted depende de ella, entonces puede que se quede con ella. ¿Quieres esa carga? –
- 1. ¿Qué es IL Weaving?
- 2. Mongodb y PostgreSql thoughts
- 3. Application Strangler Pattern Experiences & Thoughts
- 4. Aspectos interesantes de PostSharp
- 5. PostSharp 2.0 BadImageFormatException
- 6. Unit Testing and PostSharp
- 7. IL: ldfld vs ldflda
- 8. genéricos con IL?
- 9. Generando IL para métodos anónimos
- 10. Convirtiendo código IL a C#
- 11. ¿Existe algún comentario en IL?
- 12. ¿Compilador de IL para .NET?
- 13. ¿Cómo modificar argumentos de método usando PostSharp?
- 14. PostSharp OnMethodBoundaryAspect OnEntry No se está ejecutando
- 15. Suprimir PostSharp Multicast con el atributo
- 16. PostSharp en ensamblajes No tengo fuente para
- 17. ¿Alguien con experiencia en producción de Postsharp?
- 18. Mono Cecil vs. PostSharp Core vs. Microsoft CCI para implementar el marco AOP
- 19. Generación de IL para matrices dobles
- 20. Depurador de código de nivel de IL
- 21. ¿Debug.Assert genera IL en modo de lanzamiento?
- 22. ¿Cómo funciona la directiva .NET IL .maxstack?
- 23. Cómo aprender IL en el CLR
- 24. Generación de IL para métodos recursivos
- 25. diferencias IL generado para VB.NET y C#
- 26. ¿Se pueden aplicar aspectos en PostSharp sin usar atributos?
- 27. Cualquier experiencia de uso de PostSharp con ReSharper
- 28. ¿Cómo agrego argumentos a los atributos de PostSharp?
- 29. Deshabilitar Postsharp en compilaciones de depuración para toda la solución
- 30. Aplicar un atributo a una interfaz usando PostSharp
Estaba pensando lo mismo. Me encantaría escuchar lo que la gente piensa. –
Sí, me ha molestado durante algunas semanas, pero creo que la sobrecarga en el momento de la compilación bien vale la pena la falta de código de registro, será genial escuchar si alguien lo ha usado. – redsquare