Montag, Januar 27, 2020

verwenden von C# – Custom Attributes für Ausnahme-und audit-trail zur Protokollierung

ist es möglich, erstellen Sie eine benutzerdefinierte Funktion, die fängt exceptions in einer Methode, die festgelegt sind durch ein benutzerdefiniertes Attribut?

im Planung, so etwas zu tun:

[Logging(FeatureEnum.SomeFeature, IntentEnum.SomeIntent, "some comment")]
public void SomeMethodThatDoesATask()
{
    try
    {
      var doSomeAction = new LazyProcess();
      doSomeAction.WhoDunnit();
    }
    catch(Exception ex)
    {
       StaticMethodThatDoesLogging.CatchError(ex);
    }
}

Frage ist:
Wie kann ich erfassen Sie den Namen der Methode, in denen dieses Attribut gesetzt wurde, und welches Ereignis ausgelöst wurde? Es kann entweder zu erfassen oder eine Ausnahme nur automatisch melden, dass diese Methode aufgerufen wurde.

  • Kennen Sie die PostSharp-Bibliothek? sharpcrafters.com/postsharp (nicht mehr kostenlos).
  • Hallo Uwe, der Grund, warum ich mache meine eigenen.
  • Nur meine Meinung, aber die community-edition (die IST kostenlos, sortof) hat mehr als genug Möglichkeiten für die meisten Anwendungen. Ich habe gelesen, dass es einige ernsthafte Hexerei macht PostSharp Arbeit und ich würde lieber lassen Sie Sie, damit umzugehen. Ansonsten, viel Glück!

3 Kommentare

  1. 5

    Dies kann einfach erreicht werden. Zum Beispiel TypeMock verwendet .NET framework profiler-API zu überwachen, die eine Anwendung Ausführung. Es ermöglicht Ihnen die Registrierung für bestimmte Ereignisse und benachrichtigt werden, wenn eine Methode aufgerufen wird, tritt eine Ausnahme auf, … aber dies ist nicht eine einfache Aufgabe.

    Auf der anderen Seite könnten Sie AOP-aber es erfordert, dass Sie ändern Sie Ihren code so, dass der Anrufer verwendet generierten proxy anstelle des echt Klasse. Spring.NET hat einige nette features, über die es.

    Also im Grunde ohne mit dem .NET framework Profiler-API oder ohne schreiben einige benutzerdefinierte code, liest die Attribute aus einer bestimmten Klasse mit der spiegelung nicht erreichen kann, dieser. Attribute sind einfach nur Klasse Metadaten und ohne etwas, das Sinn machen würde Sie nichts tun.

    • Ich Stimme zu – es ist besser, die Bibliotheken benutzen, statt zu Rollen eine eigene Implementierung.
  2. 1

    Attribute sind nur Metadaten. Sie würde tun müssen, um code-Weberei, mit so etwas wie PostSharp, oder verwenden Sie eine Laufzeit abfangen Bibliothek wie die Burg.DynamicProxy. Selbst Attribute enthalten, die keine eigentliche Funktionalität der Anwendung, außer durch Reflexion.

    Wenn Sie eine Zeile code innerhalb der Methode, die die Protokollierung, die Sie bekommen können das stackframe der aufrufenden Methode, reflektion verwenden, um zu überprüfen, für das Attribut, und gehen von dort aus. Ich gehe davon aus, dass dies ist, was Sie tun wollten, mit StaticMethodThatDoesLogging.

    public void CatchError(Exception ex)
    {
        StackFrame parentFrame = new StackFrame(1);
        MethodBase mi = parentFrame.GetMethod();
        LoggingAttribute attr = mi.GetCustomAttributes(typeof(LoggingAttribute), true).FirstOrDefault() as LoggingAttribute;
    
        if (attr != null)
        {
           //do your logging.
        }
    }
    • Hoffentlich wird dieser kompiliert. Ich glaube nicht, Visual Studio, die praktisch, um es selbst auszuprobieren. Ich habe viel von diesem vor kurzem so, ich arbeite aus dem Gedächtnis.

Kostenlose Online-Tests