Freigeben über


Empfohlene Vorgehensweisen für 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 Subscribe- als auch die Dispose-Methoden threadsicher sein. Dies umfasst in der Regel die Verwendung einer gleichzeitigen Sammlung oder einer Sperre. Implementierungen, die nicht threadsicher sind, sollten explizit dokumentieren, dass sie dies nicht sind.

Alle zusätzlichen Garantien müssen in einer Ebene über dem Anbieter-/Beobachtervertrag festgelegt werden. Implementierer sollten klar benennen, wenn sie zusätzliche Anforderungen auferlegen, um Verwirrungen bezüglich des Beobachtervertrags zu vermeiden.

Behandeln von Ausnahmen

Aufgrund der lockeren Kopplung zwischen einem Datenanbieter und einem Beobachter sollen Ausnahmen im Beobachterentwurfsmuster informational sein. Dies beeinflusst, wie Anbieter und Beobachter Ausnahmen im Beobachter-Entwurfsmuster 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 entweder die OnError- oder die IObserver<T>.OnCompleted-Methode aufruft, sollte es keine weiteren Benachrichtigungen geben, und der Anbieter kann seine Beobachter abmelden. Die Beobachter können sich jedoch auch jederzeit abmelden, einschließlich vor und nach Erhalt einer OnErrorIObserver<T>.OnCompleted Benachrichtigung. Das Beobachter-Designmuster bestimmt nicht, ob der Anbieter oder der Beobachter für die Abbestellung verantwortlich ist; es besteht die Möglichkeit, dass beide versuchen, das Abonnement abbestellen. Wenn Beobachter das Abonnement kündigen, werden sie in der Regel aus einer Abonnentensammlung entfernt. In einer Single-Thread-Anwendung 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, es 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 in seinen Schnittstellenimplementierungen auslösen, z. B. OnNext 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