2010-09-28 21 views
1

Je me demandais si quelqu'un pouvait donner quelques conseils sur le problème suivant. Nous développons actuellement une application Silverlight 4 basée sur les services RIA .NET. L'un des écrans de l'application permet aux utilisateurs de saisir une chaîne de recherche et, après 2 secondes d'inactivité, la demande est soumise à notre service de domaine. Tout cela se manipule bien avec Rx.RIA Services correspondant à une réponse à la demande

Maintenant, il est possible qu'une seconde recherche soit exécutée avant que l'original ne soit retourné. Il est également possible que la deuxième demande puisse revenir avant la première. En réalité, j'essaie simplement de découvrir quels modèles et approches les gens utilisent pour gérer la bonne réponse à la bonne demande. Etes-vous en train d'utiliser un identifiant d'opération dans vos demandes? Créez-vous de nouvelles instances de vos services de domaine pour chaque requête? Y at-il loin de lier l'événement terminé d'une requête à l'observable Rx surveillant l'événement textchange?

Tout steer serait utile vraiment,

Dave

Répondre

0

Le chemin est l'OMI simples d'avoir un sujet pour les demandes que vous informiez avant toute demande est envoyée à WCF. Alors plutôt que de vous abonner à observable créé à partir de l'événement terminé abonnez-vous à CompletedEventObservable.TakeUntil(RequestsSubject). De cette façon, vous ne serez jamais informé de la réponse à la demande précédente.

2

Ce devrait être assez facile pour vous de résoudre ce problème.

Si je suppose que vous avez une observable de chaîne qui initie la recherche et que vous avez un service de domaine qui renvoie un Result objet lorsque donné la chaîne alors c'est le genre de code que vous avez besoin:

IObservable<string> searchText 
    = ...; 

Func<string, IObservable<Result>> searchRequest 
    = Observable.FromAsyncPattern<string, Result>(
     search.BeginInvoke, 
     search.EndInvoke); 

IObservable<Result> results 
    = (from st in searchText 
     select searchRequest(st)) 
     .Switch(); 

La magie est dans la méthode d'extension Switch qui "bascule" vers la dernière observation renvoyée par le IObservable<IObservable<Result>> - oui, c'est une observable imbriquée.

Lorsqu'un nouveau searchText entre, la requête renvoie un nouveau IObservable<Result> créé à partir du texte de recherche entrant. Le Switch bascule alors le results observable pour utiliser cette dernière observable et ignore simplement les observables créés précédemment. Par conséquent, seuls les résultats de recherche les plus récents sont observés et les résultats précédents sont ignorés.

J'espère que cela a du sens. :-)

0

Découvrez Rxx http://rxx.codeplex.com/

Il a des tonnes de choses supplémentaires qui aideront, en particulier dans votre cas, je pense que les objets dynamiques et des accessoires d'objets observables pourraient être quelque chose qui va vous rendre la vie plus facile.