2009-07-28 10 views
0

Ich wollte zunächst ein Beobachtermuster in C# 3.0 implementieren, um mein Problem zu lösen, obwohl es nicht genau auf die gleiche Weise implementiert werden würde.Alternative Entwurfsmuster zum Beobachter für .Net

Mein Problem ist, dass ich eine Webanwendung mit Benutzern habe, die Nachrichten veröffentlichen können. Benachrichtigungen werden nicht direkt an andere Benutzer gesendet, sondern an einen verteilten Cache, in dem Statistikobjekte aktualisiert werden. Benutzer können die Statistiken überprüfen und entscheiden, ob sie die Aktualisierungen wünschen oder nicht.

Ich habe derzeit eine IObserver-Schnittstelle, die mehrere Update() -Methoden basierend darauf, wer eine Nachricht und wie sie es tut, implementieren müssen.

Ich habe auch an dem Mediator Muster gesucht, aber ich glaube nicht, dass eine richtige Passform ist, weil Instanzen eines Vermittlers keine Liste, die haben würden, ist derzeit angemeldet.

ich jetzt fragen, ob es ist ein anderes etabliertes Design-Muster, das besser geeignet wäre oder wenn ich einfach mein jetziges Observer-Muster aufbauen sollte, um meinen Bedürfnissen zu entsprechen.

Dank

+0

Dieser Artikel auf MSDN gab mir eine bessere Vorstellung davon, was die Antworten unten erklärt. http://msdn.microsoft.com/en-us/library/ms954621.aspx – CountCet

Antwort

6

Kannst du es nicht über Ereignisse/Delegierten implementieren? Dies ist die Standardmethode zum Implementieren des Observer-Musters in C# und anderen .Net-Sprachen.

+0

+1. Dies ist der richtige Weg, es zu tun. – Brian

+0

Ereignisse können die früheste Implementierung des "Beobachters" sein, aber sie sind in vielerlei Hinsicht mangelhaft. Das Schlimmste ist das Fehlen eines guten Mechanismus für den Umgang mit der Abonnementlebensdauer, wenn der Herausgeber oder Abonnent nicht mehr aktiv ist [ein Abonnement sollte ungültig werden, wenn entweder der Herausgeber oder der Abonnent nicht mehr erreichbar ist]. Andere Muster können Mechanismen zur Linderung dieser Probleme bereitstellen. – supercat

+0

@supercat - Im Jahr 2009 gab es keine reaktiven Erweiterungen, keine 'Observer' /' Observable' innerhalb der BCL und Ereignisse waren es, wenn es dir nicht passte, deine eigenen zu veröffentlichen. – Oded

3

Sind nicht .Net-Ereignisse nur verdeckte Beobachtermuster? :) Sie könnten eine Klasse haben, sagen wir Statistik, und diese Klasse ein OnUpdate() -Ereignis verfügbar machen.

+1

Wenn Sie den Delegierten Ihrer Veranstaltung auf Null überprüfen lassen, bevor Sie ihn aufrufen, wird ich gezwungen, über Ihre Schulter zu schauen, um sicherzustellen, dass Sie jemand beobachtet. Was konzeptionell ziemlich komisch aussieht. – xyz

+0

Einverstanden, immer gehasst, dass auch :) – cwap

+0

@ al7ut9ov8my4wopt5ur6ais5: Geben Sie die Backing-Feld für einen Event-Delegaten ist der gleiche Name wie das Ereignis selbst war IMHO ein größerer Fehltritt in das Design von C#. Das Backing-Feld sollte einen anderen Namen erhalten haben, und der Versuch, den Ereignisnamen wie einen Methodenaufruf zu verwenden, sollte das Verhalten "Ausführen, wenn nicht null sonst nichts" generiert haben. ein Versuch, dem Ereignisnamen null zuzuordnen oder ihn mit Null zu vergleichen, hätte auf dem Backfeld funktionieren sollen. Ein Ereignisname sollte ansonsten nicht als Synonym für den Delegaten angesehen werden. – supercat

1

C# hat ein Designmuster angenommen und es zu einem erstklassigen Bürger der Sprache gemacht. Warum nicht einfach verwenden, was zur Verfügung gestellt wird? Ich sehe in Ihrem Beispiel nichts, was mit der eingebauten Event-Struktur in C# nicht möglich ist.

+0

Ich bin nicht gegen die Verwendung von Ereignissen, aber ich möchte keine bidirektionale Abhängigkeit zwischen einem Benutzer und einer Klasse haben, die das Statistik-Update implementieren würde. – CountCet

+0

Es besteht keine Abhängigkeit. Eine Klasse legt ein Ereignis offen, ein anderes behandelt es. Das Muster reduziert die Notwendigkeit von Kopplungen/Abhängigkeiten zwischen Klassen. –

+0

@EdS .: In einem ordentlichen Beobachtermuster sollte ein Ereignisverleger den Abonnenten nicht daran hindern, Müll zu sammeln (es gibt Situationen, in denen ein Ereignisteilnehmer etwas Nützliches tun könnte, ohne dass ein Verweis darauf existiert; aber diese werden heute wahrscheinlich am besten behandelt indem der Teilnehmer 'ConditionalWeakTable' verwendet, um seine Lebenszeit an die Dinge anzuhängen, die ihn interessieren könnten. Ereignisse sind eine Hauptursache für Speicherlecks in .net. – supercat

Verwandte Themen