Nasıl yapılır: Gözlemci Uygulama

Gözlemci tasarım düzeni, bildirimlere kaydolan bir gözlemci ile verileri izleyen ve bir veya daha fazla gözlemciye bildirim gönderen bir sağlayıcı arasında bir bölme gerektirir. Bu konuda gözlemci oluşturma adımları anlatılmaktadır. İlgili bir konu olan Nasıl yapılır: Sağlayıcı Uygulama, sağlayıcının nasıl oluşturulacağını açıklar.

Gözlemci oluşturmak için

  1. Arabirimi uygulayan bir tür olan gözlemciyi System.IObserver<T> tanımlayın. Örneğin, aşağıdaki kod, genel tür bağımsız değişkeniyle Temperatureoluşturulmuş System.IObserver<T> bir uygulama olan adlı TemperatureReporter bir türü tanımlar.

    public class TemperatureReporter : IObserver<Temperature>
    
    Public Class TemperatureReporter : Implements IObserver(Of Temperature)
    
  2. Gözlemci, sağlayıcı uygulamasını çağırmadan IObserver<T>.OnCompleted önce bildirimleri almayı durdurabiliyorsa, sağlayıcının IDisposableIObservable<T>.Subscribe yöntemi tarafından döndürülen uygulamayı tutacak özel bir değişken tanımlayın. Ayrıca sağlayıcının Subscribe yöntemini çağıran ve döndürülen IDisposable nesneyi depolayan bir abonelik yöntemi tanımlamanız gerekir. Örneğin, aşağıdaki kod adlı unsubscriber bir özel değişkeni tanımlar ve sağlayıcının Subscribe yöntemini çağıran ve döndürülen nesneyi değişkene unsubscriber atayan bir Subscribe yöntem tanımlar.

    public class TemperatureReporter : IObserver<Temperature>
    {
       private IDisposable unsubscriber;
       private bool first = true;
       private Temperature last;
    
       public virtual void Subscribe(IObservable<Temperature> provider)
       {
          unsubscriber = provider.Subscribe(this);
       }
    
    Public Class TemperatureReporter : Implements IObserver(Of Temperature)
    
        Private unsubscriber As IDisposable
        Private first As Boolean = True
        Private last As Temperature
    
        Public Overridable Sub Subscribe(ByVal provider As IObservable(Of Temperature))
            unsubscriber = provider.Subscribe(Me)
        End Sub
    
  3. Bu özellik gerekliyse, sağlayıcı uygulamayı çağırmadan önce gözlemcinin bildirimleri almayı durdurmasını IObserver<T>.OnCompleted sağlayan bir yöntem tanımlayın. Aşağıdaki örnek bir Unsubscribe yöntem tanımlar.

    public virtual void Unsubscribe()
    {
       unsubscriber.Dispose();
    }
    
    Public Overridable Sub Unsubscribe()
        unsubscriber.Dispose()
    End Sub
    
  4. Arabirimi tarafından tanımlanan üç yöntemin IObserver<T> uygulamalarını sağlayın: IObserver<T>.OnNext, IObserver<T>.OnErrorve IObserver<T>.OnCompleted. Sağlayıcıya ve uygulamanın OnError gereksinimlerine bağlı olarak ve OnCompleted yöntemleri saplama uygulamaları olabilir. Yöntemin OnError geçirilen Exception nesneyi özel durum olarak işlememesi gerektiğini ve yönteminin sağlayıcının OnCompletedIDisposable.Dispose uygulamasını çağırmak için serbest olduğunu unutmayın. Aşağıdaki örnekte sınıfın IObserver<T> uygulaması gösterilmektedir TemperatureReporter .

    public virtual void OnCompleted()
    {
       Console.WriteLine("Additional temperature data will not be transmitted.");
    }
    
    public virtual void OnError(Exception error)
    {
       // Do nothing.
    }
    
    public virtual void OnNext(Temperature value)
    {
       Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date);
       if (first)
       {
          last = value;
          first = false;
       }
       else
       {
          Console.WriteLine("   Change: {0}° in {1:g}", value.Degrees - last.Degrees,
                                                        value.Date.ToUniversalTime() - last.Date.ToUniversalTime());
       }
    }
    
    Public Overridable Sub OnCompleted() Implements System.IObserver(Of Temperature).OnCompleted
        Console.WriteLine("Additional temperature data will not be transmitted.")
    End Sub
    
    Public Overridable Sub OnError(ByVal [error] As System.Exception) Implements System.IObserver(Of Temperature).OnError
        ' Do nothing.
    End Sub
    
    Public Overridable Sub OnNext(ByVal value As Temperature) Implements System.IObserver(Of Temperature).OnNext
        Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date)
        If first Then
            last = value
            first = False
        Else
            Console.WriteLine("   Change: {0}° in {1:g}", value.Degrees - last.Degrees,
                                                          value.Date.ToUniversalTime - last.Date.ToUniversalTime)
        End If
    End Sub
    

Örnek

Aşağıdaki örnek, bir sıcaklık izleme uygulaması için TemperatureReporter uygulamayı sağlayan sınıfın IObserver<T> tam kaynak kodunu içerir.

public class TemperatureReporter : IObserver<Temperature>
{
   private IDisposable unsubscriber;
   private bool first = true;
   private Temperature last;

   public virtual void Subscribe(IObservable<Temperature> provider)
   {
      unsubscriber = provider.Subscribe(this);
   }

   public virtual void Unsubscribe()
   {
      unsubscriber.Dispose();
   }

   public virtual void OnCompleted()
   {
      Console.WriteLine("Additional temperature data will not be transmitted.");
   }

   public virtual void OnError(Exception error)
   {
      // Do nothing.
   }

   public virtual void OnNext(Temperature value)
   {
      Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date);
      if (first)
      {
         last = value;
         first = false;
      }
      else
      {
         Console.WriteLine("   Change: {0}° in {1:g}", value.Degrees - last.Degrees,
                                                       value.Date.ToUniversalTime() - last.Date.ToUniversalTime());
      }
   }
}
Public Class TemperatureReporter : Implements IObserver(Of Temperature)

    Private unsubscriber As IDisposable
    Private first As Boolean = True
    Private last As Temperature

    Public Overridable Sub Subscribe(ByVal provider As IObservable(Of Temperature))
        unsubscriber = provider.Subscribe(Me)
    End Sub

    Public Overridable Sub Unsubscribe()
        unsubscriber.Dispose()
    End Sub

    Public Overridable Sub OnCompleted() Implements System.IObserver(Of Temperature).OnCompleted
        Console.WriteLine("Additional temperature data will not be transmitted.")
    End Sub

    Public Overridable Sub OnError(ByVal [error] As System.Exception) Implements System.IObserver(Of Temperature).OnError
        ' Do nothing.
    End Sub

    Public Overridable Sub OnNext(ByVal value As Temperature) Implements System.IObserver(Of Temperature).OnNext
        Console.WriteLine("The temperature is {0}°C at {1:g}", value.Degrees, value.Date)
        If first Then
            last = value
            first = False
        Else
            Console.WriteLine("   Change: {0}° in {1:g}", value.Degrees - last.Degrees,
                                                          value.Date.ToUniversalTime - last.Date.ToUniversalTime)
        End If
    End Sub
End Class

Ayrıca bkz.