2010-10-04 3 views
0

J'ai un courtier de messages dactylographiés semblable à ce que Caliburn fournit:Utiliser Rx avec courtier de messages dactylographiés

public interface IMessageBroker 
{ 
    void Publish<T>(T message); 
    IDisposable Subscribe<T>(Action<T> subscriber); 
} 

Comment puis-je convertir les abonnements à IObservable?

Je veux une méthode d'extension, quelque chose comme ceci: problème

public static IObservable<T> Subscribe<T>(this IMessageBroker messageBroker) 
{ 
    var subject = new Subject<T>(); 
    messageBroker.Subscribe<T>(subject.OnNext); 
    return subject; 
} 

dans cette mise en œuvre est que je ne peux pas vous désabonner et il fuit.

Un meilleur nom pour la méthode Subscribe est également le bienvenu.

+1

Une certaine contradiction ici, votre texte dit que vous voulez convertir en IObservable, mais votre code dit «S'abonner», ce qui implique que vous voulez retourner un abonnement? Est-ce ce que suppose votre demande d'un meilleur nom? Dans ce cas, le meilleur nom serait ToObservable ... – Benjol

+0

Merci pour cette suggestion! 'ToObservable' semble bien et très descriptif. –

Répondre

3

Essayez ceci (non testé):

public static IObservable<T> ToObservable<T>(this IMessageBroker messageBroker) 
{ 
    IObservable<T> observable = Observable.CreateWithDisposable<T>(o => 
     { 
      return messageBroker.Subscribe<T>(o.OnNext); 
     }); 
    return observable; 
} 

que vous devriez être en mesure d'utiliser comme ceci:

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)); 
+0

Ai-je manqué quelque chose ou est-ce que le sujet n'est vraiment pas utilisé n'importe où? –

+0

@Konstantin, woops! Vous avez raison, corrigé (mais toujours pas testé ...) – Benjol

+0

Votre suggestion a été testée maintenant et c'est exactement ce que je voulais :) –

0

Essayez ceci (Testée)

Comment puis-je convertir des abonnements à IObservable?

Vous pouvez, en utilisant le la Observable.Create en créant la méthode d'extension suivante:

public static IObservable<T> AsObservable<T>(this IMessageBroker messageBroker) 
{ 
    return Observable.Create<T>(observer => messageBroker.Subscribe<T>(observer.OnNext)); 
} 

Note: System.Reactive paquet NuGet Indifférent ont Observable.CreateWithDisposable

ou sans Rx (pourquoi peut-être pas? vouloir des dépendances):

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); 
    } 
} 
Questions connexes