2017-07-17 15 views
1

ich diesen Ansatz bin mit meiner C# -Anwendung erweiterbar für andere Entwickler zu machen:Zugriff Daten aus der Hauptanwendung innerhalb eines Plugins in C#

Creating a simple plugin mechanism

Es funktioniert nur gut, aber nur in „eine Richtung“, die bedeutet, dass der Entwickler, der ein neues Plugin schreibt, Methoden und Variablen innerhalb des Plugins definieren kann und diese in meine Anwendung importiert werden.

Also meine Frage ist jetzt: Wie kann ich auf bereits vorhandene Daten aus meiner Hauptanwendung (z. B. eine Variable "string test") innerhalb des Plugins zugreifen?

Antwort

0

Sie müssen ein "SDK" für Ihre Anwendung erstellen, das Ihren Plug-in-Autoren zur Verfügung steht. Dies sollte Schnittstellen für alles enthalten, was Sie extern zugänglich machen möchten.

z.B.

MyAppSdk.dll

public interface IMyApplicationContext { 
    string SomeData { get; set; } 
    IMyAppService SomeService { get; set; } 
} 

public interface IPlugin { 
    void Do(IMyApplicationContext context) 
} 

Plugin

public class MyPlugin : IPlugin { 
    public void Do(IMyApplicationContext context) { 
     context.SomeService.DoAThing(); 
     System.Windows.MessageBox.Show(context.SomeData); 
    } 
} 

Anwendung

context = GetApplicationContext(); 
plugin.Do(context); 
+0

Können Sie den Teil "Anwendung" etwas genauer erklären? Ich bekomme net wie ich auf die Informationen innerhalb meines Plugins zugreifen kann. Ich habe es bereits mit einer Get/Set-Variable innerhalb der Schnittstelle versucht. Dann wollte ich Informationen aus meiner Anwendung zur Ladezeit des Plugins setzen und es innerhalb des Plugins bekommen ... Das hat aber nicht funktioniert. – Charbacca

+0

Angenommen, "IMyApplicationContext" befindet sich in einer Assembly, die von Ihrer Anwendung und dem Plug-in gemeinsam verwendet wird. Sie können sie in Ihrer App implementieren und an das Plug-in weitergeben. Wie du das machst, liegt an dir, aber ich würde dir im Allgemeinen vorschlagen, DI. – JamesT

0

Es gibt mehrere Wege.

Sie könnten ein Dictionary<string, object> erstellen, in dem jedes Modul Zugriff hat, um Daten festzulegen oder abzurufen. Sie sollten eine Logik schreiben, um auf dieses Wörterbuch zuzugreifen. Zum Beispiel eine T GetData<T>(string key) Methode, um eine Bit-Typ-Sicherheit in sie zu bringen.

Sie könnten ein Ereignissystem wie EventAggregator im PRISM-Framework verwenden, um die Kommunikation zwischen Ihren Modulen zu ermöglichen.

Aber beachten Sie, dass dies Ihre Module voneinander abhängig macht. Deshalb sollten Sie z.B. wenn Daten von einem anderen Modul nicht verfügbar sind.

+0

Wo soll ich das Wörterbuch erstellen? In meiner Hauptanwendung? Aber wie kann mein Plugin dann darauf zugreifen? – Charbacca

+0

Sie sollten es in Ihrer Hauptanwendung erstellen und es in Ihren Modulen verfügbar machen, wenn Sie sie erstellen: Fügen Sie eine Instanz der Klasse ein, aus der das Wörterbuch verfügbar ist (sollte eine Singleton-Instanz sein). –

+0

Soll ich mainApplication zu den Referenzen des Plugins hinzufügen? Ansonsten kennt das Plugin die Klassen aus meiner Hauptanwendung nicht und daher kann ich keine Instanz davon einfügen. – Charbacca

Verwandte Themen