Frage

Ich erwäge Postsharp Rahmen mit der Last der Anwendungsmethode Protokollierung zu erleichtern. Es ermöglicht im Grunde mir Methoden mit Logging-Attribut zu schmücken und bei der Kompilierung spritzt den Logging-Code in die il benötigt. Ich mag diese Lösung, da sie den Lärm aus der geruhen Zeitcode-Umgebung hält. Alle Gedanken, Erfahrungen oder bessere Alternativen?

War es hilfreich?

Lösung

Ich beantrage Anmeldung mit AOP Schloss Windsor DynamicProxies verwenden. Ich war bereits mit Schloss für sie IoC-Container ist, so ist es für AOP war der Weg des geringsten Widerstand für mich. Wenn Sie mehr Informationen lassen Sie mich wissen, ich bin in den Prozess den Code aus aufräumt für sie als Blog-Post Freigabe

Bearbeiten

Ok, hier ist der Grund Intercepter Code, faily einfach, aber es tut alles, was ich brauche. Es gibt zwei intercepters, ein protokolliert everyhing und die anderen können Sie Methodennamen zu definieren, um weitere feinkörnige Protokollierung zu ermöglichen. Diese Lösung ist faily abhängig von Schloss Windsor

abstrakte Basisklasse

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;
        }
    }
}
}

Voll Logging Implemnetation

namespace Tools.CastleWindsor.Interceptors
{
using Castle.Core.Logging;

public class LoggingInterceptor : AbstractLoggingInterceptor
{
    public LoggingInterceptor(ILoggerFactory logFactory) : base(logFactory)
    {
    }
}
}

Method Anmeldung

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);
    }
}
}

Andere Tipps

1 auf Postsharp. Seit mehreren Dinge (einschließlich einiger Versuche über das Hinzufügen von Vor- und Nachbedingungen zu C # -Code) verwenden und nicht wissen, wie ich es ohne sie machen würde ...

Es hängt in einem Ausmaß ab, wie lange Sie das Projekt entwickeln und zu unterstützen. Sicher, IL Weben eine schöne Technik, aber was passiert, wenn das IL und / oder Montag wieder Metadatenformat ändert (wie sie sich zwischen 1,1 und 2,0) und diesen Änderungen machen das Werkzeug nicht mit dem neuen Format.

Wenn Sie auf das Werkzeug hängt dann verhindert, dass Sie ein Upgrade Ihrer Technologie, bis das Werkzeug unterstützt wird. Ohne Garantien in Ort, um über diese (oder auch, dass die Entwicklung wird sich fortsetzen, obwohl es wahrscheinlich scheint), dann würde ich sehr vorsichtig sein, um sie auf ein langfristiges Projekt mit.

Kurzfristige, aber kein Problem.

Haben früher tun genau dies. Funktioniert super! Ich würde es sehr empfehlen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top