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
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
Temperature
oluş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)
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şkeneunsubscriber
atayan birSubscribe
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
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
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