Hi,
leider finde ich zum Thema Plugins nicht viel. Zumindest wenn es über eine Funktion aufrufen hinausgehen soll.
Mein Problem ist nicht das Laden der DLLs usw. sondern die Architektur des Programmes.
Mein Ansatz war bisher folgender:
Ich habe ein Interface des Pluginhosts (das stellt mein Hauptprogramm dar). Die Plugins bekommen das PluginHost Objekt übergeben und können sich an Events binden oder später auch darüber auf Datenbank, etc. zugreifen.
C#-Code: |
public interface IPluginHost
{
event EventHandler ApplicationStarted;
}
|
Mein Hauptprogramm erstellt sich dann das Hostobjekt und triggert die Events bei Bedarf bzw. stellt später die Felder zur Verfügung.
C#-Code: |
public class PluginHost : IPluginHost
{
private List<IPlugin> _plugins = new List<IPlugin>();
public event EventHandler ApplicationStarted;
public virtual void OnApplicationStarted(EventArgs e)
{
EventHandler handler = ApplicationStarted;
handler?.Invoke(this, e);
}
public PluginHost()
{
_plugins.Add(new TestPlugin.MyPlugin(this));
}
}
private void Application_Startup(object sender, StartupEventArgs e)
{
PluginHost pluginHost = new PluginHost();
pluginHost.OnApplicationStarted(e);
}
|
Das Plugin sieht dann z.B. so aus:
C#-Code: |
public class MyPlugin : IPlugin
{
public MyPlugin(IPluginHost host)
{
host.ApplicationStarted += Host_ApplicationStarted;
}
public string Title => "Test-Plugin";
private void Host_ApplicationStarted(object sender, EventArgs e)
{
Debug.WriteLine("Ich bin auch da!");
}
}
|
Jetzt meine Frage, gibts da soweit bessere Möglichkeiten das umzusetzen?
Wenn ich jetzt z.B. Plugins die Möglichkeit geben will ein MenuItem zu bekommen, habe ich das mal so gesehen:
Das heißt die rufe die Funktionen im Plugin auf und sie können mir ein Item zurückgeben oder eben Null.
C#-Code: |
public enum Menu
{
MainFile,
MainExtra,...
}
public interface IPluginHost
{
event EventHandler ApplicationStarted;
MenuItem GetMenuItem(Menu place);
}
|
Wäre das soweit alles, auch in Bezug auf .NET Core richtig oder habt ihr bessere Beispiele/Ideen?
Da das alles ziemlich tief in den Programmablauf eingebunden wird will ich es natürlich auch richtig machen