Postsharp - il Weberei - Gedanken
-
01-07-2019 - |
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?
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!