استخدم RX مع وسيط الرسائل المكتوبة
-
27-09-2019 - |
سؤال
لدي وسيط رسائل مكتوب على غرار ما يوفره Caliburn:
public interface IMessageBroker
{
void Publish<T>(T message);
IDisposable Subscribe<T>(Action<T> subscriber);
}
كيف يمكنني تحويل الاشتراكات إلى iobservable؟
أريد طريقة تمديد ، شيء من هذا القبيل:
public static IObservable<T> Subscribe<T>(this IMessageBroker messageBroker)
{
var subject = new Subject<T>();
messageBroker.Subscribe<T>(subject.OnNext);
return subject;
}
المشكلة في هذا التنفيذ هي أنه لا يمكنني إلغاء الاشتراك وبالتالي فإنه يتسرب.
كما يتم الترحيب بالاسم الأفضل لطريقة الاشتراك.
المحلول
جرب هذا (لم يخبر):
public static IObservable<T> ToObservable<T>(this IMessageBroker messageBroker)
{
IObservable<T> observable = Observable.CreateWithDisposable<T>(o =>
{
return messageBroker.Subscribe<T>(o.OnNext);
});
return observable;
}
الذي يجب أن تكون قادرًا على استخدامه مثل هذا:
var observableBroker = messageBroker.ToObservable<int>();
var subject = new Subject<int>();
observableBroker.Subscribe(subject.OnNext);
//alternatively, there are overloads of Observerable.Subscribe which take lambdas:
observableBroker.Subscribe(t => DoSomethingWith(t));
نصائح أخرى
جرب هذا (تم اختباره)
كيف يمكنني تحويل الاشتراكات إلى iobservable؟
يمكنك ، باستخدام Observable.Create
عن طريق إنشاء طريقة التمديد التالية:
public static IObservable<T> AsObservable<T>(this IMessageBroker messageBroker)
{
return Observable.Create<T>(observer => messageBroker.Subscribe<T>(observer.OnNext));
}
ملحوظة: System.Reactive حزمة nuget ليس لديها Observable.CreateWithDisposable
أو بدون RX (لماذا قد لا تكون تبعية مطلقة):
public static IObservable<T> AsObservable<T>(this IMessageBroker messageBroker)
{
return new DelegateObservable(observer => messageBroker.Subscribe<T>(observer.OnNext));
}
public class DelegateObservable<T> : IObservable<T>
{
private Func<IObserver<T>, IDisposable> subscriber;
public DelegateObservable(Func<IObserver<T>, IDisposable> subscriber)
{
this.subscriber = subscriber;
}
public IDisposable Subscribe(IObserver<T> observer)
{
return this.subscriber(observer);
}
}
لا تنتمي إلى StackOverflow