Freigeben über


Bewährte Methoden für das Beobachterentwurfsmuster

In .NET wird das Beobachterentwurfsmuster als Eine Reihe von Schnittstellen implementiert. Die System.IObservable<T> Schnittstelle stellt den Datenanbieter dar, der auch für die Bereitstellung einer IDisposable Implementierung verantwortlich ist, die Beobachtern das Abmelden von Benachrichtigungen ermöglicht. Die System.IObserver<T> Schnittstelle stellt den Beobachter dar. In diesem Thema werden die bewährten Methoden beschrieben, die Entwickler beim Implementieren des Beobachterentwurfsmusters mithilfe dieser Schnittstellen befolgen sollten.

Einfädelnd

In der Regel implementiert ein Anbieter die IObservable<T>.Subscribe Methode, indem ein bestimmter Beobachter zu einer Abonnentenliste hinzugefügt wird, die von einigen Auflistungsobjekten dargestellt wird, und er implementiert die IDisposable.Dispose Methode, indem ein bestimmter Beobachter aus der Abonnentenliste entfernt wird. Ein Beobachter kann diese Methoden jederzeit aufrufen. Da der Anbieter/Beobachter-Vertrag nicht angibt, wer nach der IObserver<T>.OnCompleted Rückrufmethode für die Abmeldung verantwortlich ist, kann der Anbieter und der Beobachter versuchen, dasselbe Mitglied aus der Liste zu entfernen. Aufgrund dieser Möglichkeit sollten sowohl die Methoden als auch threadsicher SubscribeDispose sein. Dies umfasst in der Regel die Verwendung einer gleichzeitigen Sammlung oder einer Sperre. Implementierungen, die nicht threadsicher sind, sollten explizit dokumentieren, dass sie nicht vorhanden sind.

Alle zusätzlichen Garantien müssen in einer Ebene über dem Anbieter-/Beobachtervertrag festgelegt werden. Die Implementierungen sollten deutlich herausfordern, wenn sie zusätzliche Anforderungen auferlegen, um Benutzerverwechslungen im Rahmen des Beobachtervertrags zu vermeiden.

Behandeln von Ausnahmen

Aufgrund der lockeren Kopplung zwischen einem Datenanbieter und einem Beobachter sollen Ausnahmen im Beobachterentwurfsmuster informational sein. Dies wirkt sich darauf aus, wie Anbieter und Beobachter Ausnahmen im Designmuster des Beobachters behandeln.

Der Anbieter – Aufrufen der OnError-Methode

Die OnError Methode ist als Informationsmeldung für Beobachter gedacht, ähnlich wie die IObserver<T>.OnNext Methode. Die Methode dient jedoch dazu, OnNext einem Beobachter aktuelle oder aktualisierte Daten bereitzustellen, während die OnError Methode darauf ausgelegt ist, anzugeben, dass der Anbieter keine gültigen Daten bereitstellen kann.

Der Anbieter sollte bei der Behandlung von Ausnahmen und aufrufen der OnError Methode die folgenden bewährten Methoden befolgen:

  • Der Anbieter muss seine eigenen Ausnahmen behandeln, wenn er bestimmte Anforderungen hat.

  • Der Anbieter sollte nicht erwarten oder verlangen, dass Beobachter Ausnahmen auf eine bestimmte Weise behandeln.

  • Der Anbieter sollte die OnError Methode aufrufen, wenn sie eine Ausnahme behandelt, die ihre Fähigkeit zum Bereitstellen von Updates kompromittiert. Informationen zu solchen Ausnahmen können an den Beobachter weitergegeben werden. In anderen Fällen ist es nicht erforderlich, Beobachter über eine Ausnahme zu informieren.

Sobald der Anbieter die OnError Methode aufruft IObserver<T>.OnCompleted , sollte es keine weiteren Benachrichtigungen geben, und der Anbieter kann seine Beobachter kündigen. Die Beobachter können sich jedoch auch jederzeit abmelden, einschließlich vor und nach Erhalt einer OnErrorIObserver<T>.OnCompleted Benachrichtigung. Das Designmuster des Beobachters bestimmt nicht, ob der Anbieter oder der Beobachter für die Nichtbeschreibung verantwortlich ist; Daher besteht die Möglichkeit, dass beide versuchen können, das Abonnement abbestellen zu können. Wenn Beobachter das Abonnement kündigen, werden sie in der Regel aus einer Abonnentensammlung entfernt. In einer Einzelthreadanwendung sollte die IDisposable.Dispose Implementierung sicherstellen, dass ein Objektverweis gültig ist und dass es sich bei dem Objekt um ein Element der Abonnentensammlung handelt, bevor versucht wird, ihn zu entfernen. In einer Multithreadanwendung sollte ein threadsicheres Auflistungsobjekt, z. B. ein System.Collections.Concurrent.BlockingCollection<T> Objekt, verwendet werden.

Der Beobachter – Implementieren der OnError-Methode

Wenn ein Beobachter eine Fehlermeldung eines Anbieters erhält, sollte der Beobachter die Ausnahme als informational behandeln und sollte nicht dazu verpflichtet sein, bestimmte Maßnahmen zu ergreifen.

Der Beobachter sollte diese bewährten Methoden befolgen, wenn er auf einen OnError Methodenaufruf eines Anbieters reagiert:

  • Der Beobachter sollte keine Ausnahmen von seinen Schnittstellenimplementierungen auslösen, z OnNext . B. oder OnError. Wenn der Beobachter jedoch Ausnahmen auslöst, sollte davon ausgegangen werden, dass diese Ausnahmen nicht behandelt werden.

  • Um den Aufrufstapel beizubehalten, sollte ein Beobachter, der ein Exception Objekt auslösen möchte, das an seine OnError Methode übergeben wurde, die Ausnahme umschließen, bevor es ausgelöst wird. Für diesen Zweck sollte ein Standard-Ausnahmeobjekt verwendet werden.

Weitere bewährte Methoden

Der Versuch, die Registrierung in der IObservable<T>.Subscribe Methode aufzuheben, kann zu einem Nullverweis führen. Daher wird empfohlen, diese Praxis zu vermeiden.

Obwohl es möglich ist, einen Beobachter an mehrere Anbieter anzufügen, besteht das empfohlene Muster darin, eine IObserver<T> Instanz nur an eine IObservable<T> Instanz anzufügen.

Siehe auch