Estoy tratando de entender los casos de uso correctos para las extensiones reactivas (Rx). Los ejemplos que siguen surgiendo son los eventos UI (arrastrar y soltar, el dibujo) y las sugerencias de que Rx es adecuado para aplicaciones/operaciones asíncronas, como las llamadas al servicio web.Creando una API de cliente REST usando Reactive Extensions (Rx)
Estoy trabajando en una aplicación donde tengo que escribir una pequeña API cliente para un servicio REST. Necesito llamar cuatro puntos finales REST, tres para obtener algunos datos de referencia (Aeropuertos, Aerolíneas y Estados), y el cuarto es el servicio principal que le dará los horarios de vuelo para un aeropuerto determinado.
He creado clases que exponen los tres servicios de datos de referencia y los métodos ser algo como esto:
public Observable<IEnumerable<Airport>> GetAirports()
public Observable<IEnumerable<Airline>> GetAirlines()
public Observable<IEnumerable<Status>> GetStatuses()
public Observable<IEnumerable<Flights>> GetFlights(string airport)
En mi método GetFlights Quiero que cada vuelo para almacenar una referencia al aeropuerto se salgan de, y la Aerolínea operando el vuelo. Para hacer eso, necesito que los datos de GetAirports y GetAirlines estén disponibles. Cada aeropuerto, línea aérea y estado se agregarán a un Dictionar (es decir, un diccionario) para que pueda establecer fácilmente la referencia al analizar cada vuelo.
flight.Airport = _airports[flightNode.Attribute("airport").Value]
flight.Airline = _airlines[flightNode.Attribute("airline").Value]
flight.Status = _statuses[flightNode.Attribute("status").Value]
Mi implementación actual ahora se ve así:
public IObservable<IEnumerable<Flight>> GetFlightsFrom(Airport fromAirport)
{
var airports = new AirportNamesService().GetAirports();
var airlines = new AirlineNamesService().GetAirlines();
var statuses = new StatusService().GetStautses();
var referenceData = airports
.ForkJoin(airlines, (allAirports, allAirlines) =>
{
Airports.AddRange(allAirports);
Airlines.AddRange(allAirlines);
return new Unit();
})
.ForkJoin(statuses, (nothing, allStatuses) =>
{
Statuses.AddRange(allStatuses);
return new Unit();
});
string url = string.Format(_serviceUrl, 1, 7, fromAirport.Code);
var flights = from data in referenceData
from flight in GetFlightsFrom(url)
select flight;
return flights;
}
private IObservable<IEnumerable<Flight>> GetFlightsFrom(string url)
{
return WebRequestFactory.GetData(new Uri(url), ParseFlightsXml);
}
La implementación actual se basa en la respuesta de Sergey, y utiliza ForkJoin para asegurar la ejecución secuencial y que me refiero a los datos se carga antes de los vuelos. Esta implementación es mucho más elegante que tener que iniciar un evento "ReferenceDataLoaded" como mi implementación anterior.
Respuesta actualizada: también, eche un vistazo a este hilo: http://social.msdn.microsoft.com/Forums/en/rx/thread/20e9fea1-304f-4926-aa02-49ed558a84f5 - muestra cómo escribir su almacenamiento en búfer personalizado. –