Gözlemci Tasarım Deseni En İyi Yöntemleri
.NET'te gözlemci tasarım deseni bir dizi arabirim olarak uygulanır. Arabirim System.IObservable<T> , gözlemcilerin bildirim aboneliğini kaldırmasına olanak tanıyan bir IDisposable uygulama sağlamaktan da sorumlu olan veri sağlayıcısını temsil eder. Arabirim System.IObserver<T> gözlemciyi temsil eder. Bu konu başlığında, geliştiricilerin bu arabirimleri kullanarak gözlemci tasarım desenini uygularken izlemesi gereken en iyi yöntemler açıklanmaktadır.
İş Parçacığı Oluşturma
Genellikle bir sağlayıcı IObservable<T>.Subscribe , bir koleksiyon nesnesi tarafından temsil edilen bir abone listesine belirli bir gözlemci ekleyerek yöntemini uygular ve belirli bir gözlemciyi IDisposable.Dispose abone listesinden kaldırarak yöntemini uygular. Bir gözlemci bu yöntemleri istediği zaman çağırabilir. Buna ek olarak, sağlayıcı/gözlemci sözleşmesi geri çağırma yönteminden sonra IObserver<T>.OnCompleted abonelikten kimin sorumlu olduğunu belirtmediğinden, sağlayıcı ve gözlemci aynı üyeyi listeden kaldırmayı deneyebilir. Bu olasılık nedeniyle hem ve SubscribeDispose yöntemleri iş parçacığı açısından güvenli olmalıdır. Bu genellikle eşzamanlı koleksiyon veya kilit kullanmayı içerir. İş parçacığı güvenli olmayan uygulamalar, bunların olmadığını açıkça belgelemelidir.
Ek garantiler, sağlayıcı/gözlemci sözleşmesinin üzerindeki bir katmanda belirtilmelidir. Uygulayıcılar, gözlemci sözleşme hakkında kullanıcı karışıklığını önlemek için ek gereksinimler getirdiğinde açıkça çağrı yapmalıdır.
Özel Durumları İşleme
Veri sağlayıcısı ile gözlemci arasındaki gevşek bağlantı nedeniyle, gözlemci tasarım düzenindeki özel durumların bilgilendirici olması amaçlanmıştır. Bu, sağlayıcıların ve gözlemcilerin gözlemci tasarım düzenindeki özel durumları nasıl işlediğini etkiler.
Sağlayıcı—OnError Yöntemini Çağırma
OnError yöntemi, yöntemine çok benzer IObserver<T>.OnNext şekilde gözlemcilere bilgilendirme iletisi olarak tasarlanmıştır. OnNext Ancak, yöntem geçerli veya güncelleştirilmiş verileri bir gözlemci sağlamak için tasarlanmıştırkenOnError, yöntem sağlayıcının geçerli veri sağlayamadığını göstermek için tasarlanmıştır.
Sağlayıcı, özel durumları işlerken ve yöntemini çağırırken şu en iyi yöntemleri izlemelidir OnError :
Belirli gereksinimleri varsa sağlayıcının kendi özel durumlarını işlemesi gerekir.
Sağlayıcı, gözlemcilerin özel durumları belirli bir şekilde işlemesini beklememeli veya gerektirmemelidir.
Sağlayıcı, güncelleştirme sağlama becerisini OnError tehlikeye atacak bir özel durumu işlediğinde yöntemini çağırmalıdır. Bu tür özel durumlarla ilgili bilgiler gözlemciye geçirilebilir. Diğer durumlarda, bir özel durumu gözlemcilere bildirmeye gerek yoktur.
Sağlayıcı veya IObserver<T>.OnCompleted yöntemini çağırdıktan OnError sonra başka bildirim olmaması gerekir ve sağlayıcı gözlemcilerinin aboneliğini kaldırabilir. Ancak, gözlemciler ya da bildirim almalarından OnErrorIObserver<T>.OnCompleted önce ve sonra da dahil olmak üzere istedikleri zaman aboneliklerini kaldırabilirler. Gözlemci tasarım düzeni, sağlayıcının veya gözlemcinin abonelikten çıkmaktan sorumlu olup olmadığını belirlemez; Bu nedenle, her ikisinin de abonelikten çıkma girişiminde bulunma olasılığı vardır. Genellikle, gözlemciler aboneliği kaldırdığında abone koleksiyonundan kaldırılırlar. Tek iş parçacıklı bir uygulamada, IDisposable.Dispose uygulama kaldırmaya çalışmadan önce nesne başvurusunun geçerli olduğundan ve nesnenin aboneler koleksiyonunun bir üyesi olduğundan emin olmalıdır. Çok iş parçacıklı bir uygulamada, nesne gibi iş parçacığı güvenli bir System.Collections.Concurrent.BlockingCollection<T> koleksiyon nesnesi kullanılmalıdır.
Gözlemci— OnError Yöntemini Uygulama
Bir gözlemci bir sağlayıcıdan hata bildirimi aldığında, gözlemci özel durumu bilgilendirici olarak değerlendirmeli ve belirli bir eylemde bulunması gerekmemelidir.
Gözlemci, sağlayıcıdan bir OnError yöntem çağrısına yanıt verirken şu en iyi yöntemleri izlemelidir:
Gözlemci, veya OnErrorgibi OnNext arabirim uygulamalarından özel durumlar oluşturmamalıdır. Ancak, gözlemci özel durumlar oluşturursa, bu özel durumların işlenmemiş olmasını beklemelidir.
Çağrı yığınını korumak için, yöntemine geçirilen OnError bir nesneyi atmak isteyen bir Exception gözlemci, özel durumu oluşturmadan önce sarmalamalıdır. Bu amaç için standart bir özel durum nesnesi kullanılmalıdır.
Ek En İyi Yöntemler
yönteminde kaydını kaldırmaya IObservable<T>.Subscribe çalışmak null başvuruya neden olabilir. Bu nedenle, bu uygulamadan kaçınmanızı öneririz.
Birden çok sağlayıcıya gözlemci eklemek mümkün olsa da, önerilen desen yalnızca IObservable<T> bir örneğe örnek IObserver<T> eklemektir.