Laden...

MEF und Events

Erstellt von Cokie vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.410 Views
C
Cokie Themenstarter:in
33 Beiträge seit 2013
vor 9 Jahren
MEF und Events

Guten Nabend,

ich habe ein kleines Problem mit MEF und Events. Kurz gesagt ich bekomme einfach keine Events durch das MEF durch. Ich hab auch schon Google bemüht und bin dort auf EventAggregator gestossen. Nur fehlt mir da Anscheinend das Verständnis wie man die einbinden soll. Hat jemand ne Seite die Das erklärt oder einen Tipp.

MFG

Cokie

P
1.090 Beiträge seit 2011
vor 9 Jahren

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
Cokie Themenstarter:in
33 Beiträge seit 2013
vor 9 Jahren

Jo danke,

allerdings scheint das nich mehr ganz aktuell zu sein.
Gibts eine bessere Möglichkeit Events über MEF rauszubringen?

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Cokie,

was genau hast du probiert? Was genau geht nicht? Was genau verstehst du nicht? Was im Detail ist der Punkt, an dem du hängst? Siehe auch [Hinweis] Wie poste ich richtig? Punkt 5.

herbivore

C
Cokie Themenstarter:in
33 Beiträge seit 2013
vor 9 Jahren

Also,

ich erkläre mal Genauer.
Ich hab eine Plugin klasse mit den Interfaces:


public class Host
    {
public interface ISMSVersandErfolgreichEventArgs
    {
        bool VersandErfolgreich { get; set; }

    }
       

        public interface ISMSVerschicken
        {
            bool Senden(string SMSText, string Telefonnummer);
            void Form();
            void Form(string HandyNummer, string SMSText);
            void EinstellungsForm();
            event EventHandler<ISMSVersandErfolgreichEventArgs> SendenErfolgreich;
            }
}
        

Eine Klasse soll das Interface Implementieren.



    [Export(typeof(PluginSystem.Host.ISMSVerschicken))]
    class PluginInterface : PluginSystem.Host.ISMSVerschicken

Wenn ich den VS Magie Kasten greife und per Automagisch Generierung die denn Rumpf mit zusammen bauen lasse bekommen ich folgendes.

 
event EventHandler<PluginSystem.Host.ISMSVersandErfolgreichEventArgs> PluginSystem.Host.ISMSVerschicken.SendenErfolgreich
        {
            add { throw new NotImplementedException(); }
            remove { throw new NotImplementedException(); }
        }

Und da hörts bei mir auf. Ich weis das is Grundlage. Ich hab schon die MSDN durchforstet usw. Aber geholfen hat mir das Beispiel dort auch nich.

Ein "normal" Event Implementieren is kein Problem. Das bekomm ich hin. Aber über die Schnittstelle geht das in die Hose.
Deshalb wäre es Nett wenn mir das jemand erklären kann. Wie ich das Event mit dem Generischen Eventhandler aufgerufen/ausgelöst bekomme.

P
1.090 Beiträge seit 2011
vor 9 Jahren

Nun ja da hilft dann Google: C#: event with explicity add/remove != typical event?.

Da MEF standardmäßig die Instanzen als SingelTon erzeugt kann es mit Events zu MemoryLeaksführen. Ich bin mir gerade auch nicht sicher ob Events überhaupt Funktionieren. Das Event Aggregator Pattern zu verwenden ist da wohl die bessere Lösung.

Von Prism gibt es auch eine Aktuelle Dokumentation. Ich denke mal die bekommst du selbst gegooglet.

MFG
Björn

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
Cokie Themenstarter:in
33 Beiträge seit 2013
vor 9 Jahren

Mh,

ok das mit dem Event Aggregator hatte ich schon gesehen. Schau ich mir nochmal genauer an.

Jetzt stellt sich mir die Frage. Wie soll man denn dann über das MEF Plugin System, die Anwendung benachrichtigen das sich was im Plugin geändert hat. wenn Events da nich so optimal sind. Das Event Aggregator schein ja eher ein WPF Konstrukt zu sein, und hat nichts direkt mit dem MEF zu tun, ist also eher eine "Notlösung".

211 Beiträge seit 2008
vor 9 Jahren

Du kannst dir auch eine Property bauen die eine Action/Func entgegennimmt?
Also im Grunde ein delegate und dort kannst du dann deine jeweilige Methode zuweisen.

Aber ich würde an deiner Stelle nochmal kurz einen Schritt zurückgehen und nochmal auf das Ganze sehen da ich glaube das kannst du einfacher lösen.

Du willst benachrichtigt werden wenn die SMS verschickt worden ist, da würde es sich auch anbieten das per async/await zu machen dh. ein Task?

Ansonsten bau dir die Klasse doch einfach so dass du den EventHandler in der implementierung hältst ?


private event EventHandler<PluginSystem.Host.ISMSVersandErfolgreichEventArgs> _myEvent;

event EventHandler<PluginSystem.Host.ISMSVersandErfolgreichEventArgs> PluginSystem.Host.ISMSVerschicken.SendenErfolgreich
{
            add { _myEvent += value; }
            remove { _myEvent -= value; }
}

Kontakt & Blog: www.giesswein-apps.at