سؤال

لدي وسيط رسائل مكتوب على غرار ما يوفره 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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top