MEF einzelnen Plugin einen Wert übergeben.

  • Allgemein

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    MEF einzelnen Plugin einen Wert übergeben.

    Hallo liebe Community!
    Ich hätte eine rasche Frage, undzwar wie kann ich mit MEF einem bestimmten Plugin einen Wert übergeben?
    Nehmen wir an, ich möchte meinem Plugin diese Zeile geben "-Location:c:\", jedoch möchte ich, dass dies nur ein bestimmtes Plugin bekommt.


    Wie stelle ich das am besten an?
    Danke im Vorraus.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Eben, ich kenn mich mit dem ganzen noch nicht wirklich aus.
    Ich habe mir nikeee's tutorial angesehen, und nun habe ich 2 Fragen:
    1. (Die schon oben angesprochen)
    2. Wie kann ich allgemein einzelne Plugins ansprechen. Z.b. von einem Plugin die Version auslesen.

    Code:
    PluginInterface:

    VB.NET-Quellcode

    1. 'Plugin-Support:
    2. Imports System.ComponentModel.Composition
    3. Imports System.ComponentModel.Composition.Hosting
    4. Namespace Plugins
    5. #Region "---Interfaces---"
    6. Public Interface IPlugin
    7. Function GetDeveloper() As String
    8. Function GetVersion() As String
    9. Function GetDescription() As String
    10. Function GetName() As String
    11. End Interface
    12. #End Region
    13. #Region "---Classes---"
    14. Class PluginConnection
    15. <ImportMany(GetType(IPlugin))> _
    16. Public Plugins As IPlugin()
    17. Public Sub LoadPlugins()
    18. Dim catalog = New DirectoryCatalog(Application.StartupPath & "\Plugins") 'Eine Import-Quelle angeben (gibt noch andere)
    19. Dim container = New CompositionContainer(catalog) 'Quelle zum Container hinzufügen
    20. container.ComposeParts(Me)
    21. End Sub
    22. End Class
    23. #End Region
    24. End Namespace


    Plugin-Verbindung:

    VB.NET-Quellcode

    1. Dim verbindung As New Plugins.PluginConnection()
    2. verbindung.LoadPlugins()
    3. For Each plugin As Plugins.IPlugin In verbindung.Plugins
    4. lbPlugins.Items.Add(plugin.GetName)
    5. Next
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Bau eine Funktion die dir ein Plugin per Name wieder gibt, du durchsuchst alle Plugins in den Array, und wenn eins blbla heißt gibst du es zurück, wird keins gefunden, throw ne Exception.

    Zu 1)

    Falls das nur spezielle Plugins brauchen da mach eine neue Klasse dafür INeedParameters oder sowas, und wenn du deine Plugins durchläufst, schaust du, ob du eines davon zu INeedParameters casten kannst.
    Erst mal so nebenbei: das sollten eigentlich alles Properties sein, keine Funktionen, von wegen verständlicher Code und so. ;)

    Du hast ja nun ne Liste deiner Plugins. Wenn das Plugin z.B. vom User ausgewählt werden soll, dann kannst du diese List z.B. an ne Combobox binden, mit Displaymember "Name", und dann hast du das entsprechende Plugin als Valuemember. Oder wenn du den namen des Plugins als String vorliegen hast, dann kannst du mit ner einfachen ForEach-Schleife nach dem Plugin suchen.
    Jap, das mit dem Properties kommt natürlich noch.
    Ich hab mir Punkt 2 so vergestellt:

    VB.NET-Quellcode

    1. Dim verbindung As New Plugins.PluginConnection()
    2. Dim lPlugins As List(Of Plugins.IPlugin)
    3. verbindung.LoadPlugins()
    4. For Each plugin As Plugins.IPlugin In verbindung.Plugins
    5. lbPlugins.Items.Add(plugin.GetName.ToString)
    6. lPlugins.Add(plugin.GetName)
    7. Next


    VB.NET-Quellcode

    1. Private Sub lbPlugins_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbPlugins.SelectedIndexChanged
    2. lblProducer.Text = lPlugins(lbPlugins.SelectedIndex).GetDeveloper
    3. lblPluginVersion.Text = lPlugins(lbPlugins.SelectedIndex).GetVersion
    4. End Sub


    PluginFunktion:

    VB.NET-Quellcode

    1. Public Function GetName() As IPlugin Implements IPlugin.GetName
    2. Return Me
    3. End Function


    Jedoch verstehe ich nicht ganz wieso das nicht Funktioniert.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Logisch. Auch getan.
    ( lbPlugins.DataSource = lPlugins
    Jedoch zeigt sich da noch weniger Erfolg als sonst. (Keine Items in der Box)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Und du hast auch den Displaymember festgelegt?

    Warum ist eigentlich deine GetName-Funktion so komisch? Die ist momentan vollkommen nutzlos, da sie einfach nur die Instanz selbst zurückgibt. Lasse GetName doch einfach den Namen als String zurückgeben.
    Ganz ehrlich, ich kenn micht gerade gar nicht aus.
    Hättest du da noch Lesestoff? (abgesehen von nikeee's Tutorial).

    Artentus schrieb:

    Warum ist eigentlich deine GetName-Funktion so komisch?

    Damit ich die List(Of IPlugin) Leicht befüllen kann...
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Uhm... Ja gesagt getan, dennoch füllt sich die box jetzt gar nicht :)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Artentus
    Gesagt getan. Selbes Ergebnis. Nichts.

    VB.NET-Quellcode

    1. Property Description As String
    2. Property Name As String


    VB.NET-Quellcode

    1. 'Plugins laden
    2. verbindung.LoadPlugins()
    3. For Each plugin As Plugins.IPlugin In verbindung.Plugins
    4. lPlugins.Add(CType(plugin.Name, Plugins.IPlugin))
    5. Next
    6. lbPlugins.DataSource = lPlugins
    7. lbPlugins.DisplayMember = Name


    Wobei ich mich hier wahrscheinlich dümmer stelle als ich wirklich bin...
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    So:

    VB.NET-Quellcode

    1. verbindung.LoadPlugins()
    2. For Each plugin As Plugins.IPlugin In verbindung.Plugins
    3. lPlugins.Add(plugin)
    4. Next
    5. lbPlugins.DataSource = lPlugins
    6. lbPlugins.DisplayMember = "Name"

    Es ist ein Wunder, das dir kein Fehler um die Ohren geflogen ist.
    *Kopf gegen die Wand hau*
    Eigentlich klar >-<

    Umsomehr wundert es mich dass ich dennoch kein Ergebnis angezeigt bekomme.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Hm, ich hab mal selbst rumprobiert. So hats funktioniert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private plugins As List(Of Plugin)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. plugins = New List(Of Plugin)
    5. plugins.Add(New Plugin() With {.Name = "Test1", .Version = New Version(1, 5), .Description = "Plugin Nr. 1"})
    6. plugins.Add(New Plugin() With {.Name = "Test2", .Version = New Version(0, 8), .Description = "Plugin Nr. 2"})
    7. plugins.Add(New Plugin() With {.Name = "Test3", .Version = New Version(2, 1), .Description = "Plugin Nr. 3"})
    8. ListBox1.DataSource = plugins
    9. ListBox1.DisplayMember = "Name"
    10. End Sub
    11. End Class
    12. Public Class Plugin
    13. Public Property Name As String
    14. Public Property Version As Version
    15. Public Property Description As String
    16. End Class

    Das ist so ziemlich das selbe, was du hast. Lass dir vielleicht einfach mal per Debug.Print oder per MessageBox die Namen alle Plugins in der Liste ausgeben, um sicherzugehen, dass sie auch alle richtig geladen werden.
    Ja, aber das ganze muss ja dynamisch ablaufen,
    So viele Plugins wie man möchte, und Name beschreibung etc. aus Plugin auslesen...
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Das Plugin laden klappt jetzt, dennoch hätte ich weitere Fragen:
    1. Wie mach ich das am besten, um zu überprüfen, ob ein Plugin geladen ist (dies dann in ner checkedlistbox anzuzeigen.)
    bzw. wie speichere ich das am besten ab?

    (Natürlich weiß ich wie Speichern usw. funktioniert ._.)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!