Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
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ı olanTemperatureReporter
adlı bir türü tanımlar.public class TemperatureReporter : IObserver<Temperature>
Public Class TemperatureReporter : Implements IObserver(Of Temperature)
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ınSubscribe
yöntemini çağıran ve döndürülen nesneyi Subscribe değişkenine atayan birunsubscriber
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
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
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