5 Stimmen

MEF ComposeParts. Wie man Plugin-Ausnahmen behandelt

Ich habe im Web nach einer Lösung gesucht, aber nichts gefunden.

In meiner C#-Anwendung verwende ich MEF zur Implementierung eines Plug-In-Musters. Alles funktioniert gut. Heute habe ich jedoch versucht herauszufinden, was passiert, wenn aus irgendeinem Grund ein Plugin-Konstruktor eine Ausnahme auslöst.

Zum Laden von Plugins verwende ich CompositionContainer.ComposeParts. Wenn aus irgendeinem Grund eines der X-Plugins eine Ausnahme auslöst, schlägt diese Methode fehl und nichts wird geladen.

Gibt es eine Möglichkeit, nur die einzelne Ausnahme abzufangen, protokollieren und fortzufahren?

Vielen Dank im Voraus.

5voto

Adi Lester Punkte 24217

Ich vermute, dass du CompositionContainer.ComposeParts(this) aufrufst, wobei this eine ähnliche Eigenschaft wie diese hat:

[ImportMany]
public IPlugin[] Plugins { get; set; }

was bedeutet, dass wenn du ComposeParts aufrufst, die Konstruktoren aller Plugins aufgerufen werden. Alternativ könntest du von Lazy Loading Gebrauch machen, was die Konstruktoraufrufe aufschiebt, bis du tatsächlich ein Plugin verwendest

[ImportMany]
public Lazy[] Plugins { get; set; }

Dann, wenn du alle Plugins initialisieren möchtest, könntest du etwas wie dies haben, was Ausnahmen protokolliert, aber dich nicht daran hindert, andere Plugins zu laden:

public void InitPlugins()
{
    foreach (Lazy lazyPlugin in Plugins)
    {
        try
        {
            // Rufe den Konstruktor des Plugins auf
            var plugin = lazyPlugin.Value;

            // Führe hier jede weitere Initialisierung durch
        }
        catch (Exception ex)
        {
            // Protokolliere die Ausnahme und fahre mit der Iteration fort
        }
    }
}

0voto

testalino Punkte 5484

Ich habe festgestellt, dass der Wechsel von ImportMany zu Import und dann im Grunde genommen das Erstellen eines CompositionContainers + DirectoryCatalog für jede DLL es mir ermöglicht hat, problemlos inkompatible Plugins zu erkennen und zu filtern.

Es war auch nicht spürbar langsamer als das Aufrufen von compose auf mehreren Katalogen gleichzeitig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X