Aracılığıyla paylaş


Nasıl yapılır: Bir Gözlemci Uygulamak

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. ile ilgili bir konu olan "Nasıl Yapılır: Sağlayıcı'i Uygulama", bir sağlayıcı oluşturmanın nasıl yapılacağını tartışır.

Gözlemci oluşturmak için

  1. System.IObserver<T> arabirimini uygulayan bir tür olan gözlemciyi tanımlayın. Örneğin, aşağıdaki kod, Temperature genel tür bağımsız değişkenine sahip, yapılandırılmış bir System.IObserver<T> uygulaması olan TemperatureReporter adlı bir türü tanımlar.

    public class TemperatureReporter : IObserver<Temperature>
    
    Public Class TemperatureReporter : Implements IObserver(Of Temperature)
    
  2. Gözlemci, sağlayıcı IObserver<T>.OnCompleted uygulamasını çağırmadan önce bildirim almayı durdurabiliyorsa, sağlayıcının IDisposable yöntemi tarafından döndürülen IObservable<T>.Subscribe uygulamasını 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 nesnesini depolayan bir abonelik yöntemi tanımlamanız gerekir. Örneğin, aşağıdaki kod unsubscriber adlı bir özel değişken tanımlar ve sağlayıcının Subscribe yöntemini çağıran ve döndürülen nesneyi Subscribe değişkenine atayan bir unsubscriber yöntemi 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ı IObserver<T>.OnCompleted uygulamasını çağırmadan önce gözlemcinin bildirimleri almayı durdurmasını sağlayan bir yöntem tanımlayın. Aşağıdaki örnek bir Unsubscribe yöntemi tanımlar.

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

    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 {value.Degrees}°C at {value.Date:g}");
       if (first)
       {
          last = value;
          first = false;
       }
       else
       {
          Console.WriteLine($"   Change: {value.Degrees - last.Degrees}° in {value.Date.ToUniversalTime() - last.Date.ToUniversalTime():g}");
       }
    }
    
    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 uygulamasını sağlayan IObserver<T> sınıfının 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 {value.Degrees}°C at {value.Date:g}");
      if (first)
      {
         last = value;
         first = false;
      }
      else
      {
         Console.WriteLine($"   Change: {value.Degrees - last.Degrees}° in {value.Date.ToUniversalTime() - last.Date.ToUniversalTime():g}");
      }
   }
}
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.