Frage

Ich habe eine Art Plugin -Architektur in meiner Lösung. Es gibt einen bekannten Ordner, in dem Plugins darin platziert werden sollen. Die Plugins implementieren eine Schnittstelle, die im Hostprojekt gemeinsam genutzt wird.

Anfangs lade ich das Plugin über Assembly.LoadFrom(fi.FullName).GetTypes()und instanziieren Sie den benötigten Typ von (IPlugin)Activator.CreateInstance(type);.

Daher kann der Host (Hauptanwendung) einen entsprechenden Code ausführen, der von der Plugin -Montage implementiert wird. Das funktioniert bisher gut.

Vor kurzem habe ich jedoch versucht, die Anwendungsprotokollierung über NLOG zu implementieren und NLOG im Hostprojekt zu konfigurieren, das großartig funktioniert hat.

Das Problem ist, dass ich in der Plugin -Baugruppe (den bereits konfigurierten) Logger verwenden möchte. Wenn ich nur auf NLOG verweist und es benutze LogManager.GetCurrentClassLogger(); Es scheint keinen Konfigurationssatz zu geben. Es logt sich nicht bei den Dateien an, die ich im Hostprojekt aus der Plugin -Montage konfiguriert habe.

Ich dachte daran, eine Nlogger -Instanz (im Hostprojekt erstellt) einer Eigenschaft des Plugin -Typs zu verleihen.

Ist dies möglich oder gibt es eine bevorzugte Möglichkeit, solche Dinge zu erreichen? Vielen Dank

War es hilfreich?

Lösung

Dies sollte funktionieren - NLOG -Konfiguration sollte auch für die geladenen Plugin -Baugruppen funktionieren. Das Problem hängt wahrscheinlich damit zusammen, wie Ihre Plugins geladen werden. Vielleicht befinden sie sich in einer separaten Domäne (ich erinnere mich nicht, wie es funktioniert), sodass NLOG nicht auf die Protokollierungskonfiguration Ihrer Hauptanwendungen zugreifen kann.

In diesem Fall können Sie versuchen, separate NLOG -Konfigurationsdateien für Ihre Plugin -Baugruppen hinzuzufügen (Lesen Sie die NLOG -Dokumentation zu Konfigurationsdateien -Konventionen).

Ich glaube nicht, dass der IOC -Container Ihnen bei dynamisch geladenen Plugins hilft. Der Container weiß nicht, dass Sie die Art und Weise ändern müssen, wie Plugins geladen und konfiguriert werden. Und IMHO mit IOC zum Konfigurieren von NLOG ist keine gute Idee.

Wenn die vorherigen Optionen nicht funktionieren, können Sie versuchen, den Montage -Prüfpfad in app.config zu ändern, damit Ihre Plugins in die Standarddomäne geladen werden - dann sollte NLOG für diese Plugins funktionieren (zumindest für mich funktioniert):

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <probing privatePath="Plugins" />
</assemblyBinding>

Andere Tipps

Schauen Sie sich Abhängigkeitsinjektionsbehälter wie Einheit oder Lightcore an.

Sie sind eine Art "Komponentenregistrierungsgeschäfte"

Dort können Sie Komponenten an Schnittstellen registrieren. Dann müssen Ihre Verbraucher nur eine Schnittstelle anfordern.

Die Zuordnung von Schnittstellen - Komponente kann in Konfigurationsdateien oder Quellcode erstellt werden.

Sie können also die Zuordnung ohne Schmerzen ändern.

Wenn sie beispielsweise neue Instanzen erstellen und Sie als CTOR -Parameter Komplexe haben, können sie automatisch suchen, wenn diese Komponenten registriert sind, und sie dann automatisch injizieren.

Einige Schlüsselwörter, die Ihnen helfen können, sind "servicelocator" "microkernel" "Abhängigkeitsinjektion"

Komponenten:

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