Wenn ich eine API-Assembly für eine andere Person schreibe, wäre es nützlich, eine Protokollierungsfunktion zu haben, die bei der Diagnose der Probleme der Clients hilft.
Wenn ich jedoch beispielsweise log4net in meiner Assembly referenziere, könnte dies mit der Version von log4net kollidieren, die von der Client-Anwendung verwendet wird.
Ich möchte das Rad nicht neu erfinden, indem ich mein eigenes Protokollierungs-Framework schreibe.
Was ist der beste Weg, um mein Dilemma zu lösen?
Bearbeiten: Ich nehme an, ich könnte verlangen, dass die bestimmte Version von log4net, die ich verwende, in den GAC installiert wird, um den Versionskonflikt mit dem Client zu vermeiden, aber das würde die API zu einer fetten Sache machen, die eine Installation erfordert. in der Versammlung.
Sehen Sie sich an, wie SpringFramework dieses Problem löst. Es verwendet Common.Logging, das dann über die Konfigurationsdatei log4net oder einem anderen benutzerdefinierten Logging-Framework zugeordnet werden kann. Sie finden weitere Details auf der Common.Logging-Website , aber Sie tun im Wesentlichen Folgendes:
%Vor%
Wenn der Client auch SpringFramework oder Common.Logging direkt verwendet, ist der Konflikt immer noch möglich, aber seine Chancen sind aus den folgenden Gründen stark verringert:
Verwenden Sie die Enterprise-Bibliothek . Es ist flexibel genug und verwendet sowohl eingebaute Logger als auch eigene Logger. Es war auch ziemlich verison-kompatibel. Es ist konfigurierbar genug, dass, wenn es einen Konflikt mit einer bestimmten Komponente gab, Sie es einfach mit Konfigurationsänderungen austauschen könnten.
Verwenden Sie System.Diagnostics.Trace
. Keine Chance der Versionskonflikte dann!
Dies ist der Punkt, an dem die Abhängigkeitsinjektion Ihr Freund ist - Sie müssen wahrscheinlich nicht das gesamte log4net verwenden, sondern einige kleine Teile davon. Schreiben Sie also eine ILogger-Klasse in Ihre App, die Ihre Funktionalität offen legt, und schreiben Sie dann eine Implementierung für alle Logger, die Sie verwenden möchten. Zum Beispiel ist ein Debug.Trace () - Logger ideal für Entwicklungs- oder Debugging-Arbeiten, während Sie möglicherweise einen log4net-Treiber für die Produktion benötigen. Verwenden Sie dann die Abhängigkeitsinjektion, z. B. StructureMap, um die Instanzen Ihrer Protokollfunktion in den Produktionscode einzufügen.
Verwenden Sie Abhängigkeitsinjektion (Unity, Castle Windsor, etc.), um anzugeben, was die log4net-dll auf diese Weise verwenden soll, wenn der Client eine ältere Version verwendet, Sie können einfach dort eine Version von log4net einstecken, wenn sie nicht vorhanden ist dann stellen Sie Ihre eigenen zur Verfügung.
Wenn Sie die Protokollinformationen extern an die Personen weitergeben möchten, die sie verwenden, könnte es sich lohnen, einen Dienst wie 3scale zu verwenden (Disclaimer, Ich arbeite dort) - es lässt Sie Protokolle und Verkehrsinformationen schreiben und Entwicklern eine Schnittstelle geben, um Statistiken, Fehler, API-Schlüssel, Ratenbegrenzungen usw. zu sehen. Es sammelt auch dieses Zeug für Sie, so dass Sie es an einem Ort haben .