Ich habe, was ich denke, ist ein einfaches "Problem", zu dem ich ein paar Lösungen gefunden habe, aber ich bin mir nicht sicher, welcher Weg zu gehen und die beste Praxis in C#.C# :: Wann verwenden Sie Ereignisse oder eine Sammlung von Objekten, die von einer Ereignisbehandlungsschnittstelle stammen?
Ich habe ein Master-Objekt (sagen ein Singleton) einmal während der Lebensdauer der Anwendung installiert. Diese "MasterClass" erzeugt eine Menge neuer Arten von Objekten, sagen wir "SlaveClass" jedes Mal, wenn MasterClass.Instance.CreateSlaveObject aufgerufen wird.
Diese MasterClass überwacht auch ein anderes Objekt auf Statusänderungen und benachrichtigt in diesem Fall die SlaveClass-Objekte, die von der Änderung erstellt wurden. Scheint einfach genug.
Da ich von der nativen C++ Welt kommen, so wie ich es tat es zuerst eine Schnittstelle
Interface IChangeEventListener
{
void ChangeHappened();
}
, von denen habe ich „SlaveClass“ abgeleitet. Dann in meiner "MasterClass" ich habe:
...
IList<IChangeEventListener> slaveList;
...
CreateSlaveObject
{
...
slaveList.Add(slave);
}
...
ChangeHappened()
{
...
foreach(var slave in slaveList)
{
slave.ChangeHappened();
}
}
Und das funktioniert. Aber ich fragte mich immer wieder, ob es eine andere (bessere) Art und Weise gibt, dies zu tun. Also recherchierte ich ein wenig mehr zum Thema und sah die C# -Ereignisse.
Anstatt also eine Sammlung von Slaves in der MasterClass zu verwalten, würde ich die MasterClass im Prinzip in den ctor von SlaveClass (oder über eine Eigenschaft) einfügen und das SlaveClass-Objekt als Event-Handler ChangeHapped hinzufügen lassen. dies würde illustriert:
...Master...
public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args);
public event NewUpdateDelegate ChangeHappenedEvent;
....
public SlaveClass (MasterClass publisher) //inject publisher service
{
publisher.ChangeHappenedEvent += ChangeHappened;
}
Aber dies scheint wie eine unnötige Kopplung zwischen dem Slave und dem Meister zu sein, aber Ich mag die Eleganz des bereitgestellten build-in Ereignisbenachrichtigungsmechanismus.
Also sollte ich meinen aktuellen Code behalten oder zum ereignisbasierten Ansatz (mit Publisher-Injektion) wechseln? und warum?
Oder wenn Sie eine alternative Lösung vorschlagen können, die ich vielleicht verpasst habe, würde ich das auch schätzen.
Ordentlich! Ich mag den Ansatz, den Sie von dem Meister vorgeschlagen die Veranstaltung Einhakens kümmern, aber die Ereignisse Mechanismus zu halten :) Das Problem, das ich sehe, ist, wie Sie gefragt, gibt es keine Garantie, dass der Slave solange den Meister lebt ... also wenn ich das Ereignis im Slave destructor aushängen wollen, werde ich die Kupplung bringen:/ – Futurist
Nun, gibt es eine Alternative, lassen Sie mich meine Antwort ändern. –
Danke für die ausführliche Antwort. Ich werde darüber nachdenken, da es einige Konzepte (wie die schwache Referenz) gibt, die mir noch unbekannt sind. – Futurist