Я пытаюсь настроить правильные варианты использования для реактивных расширений (Rx). Примерами, которые продолжают расти, являются события пользовательского интерфейса (перетаскивание, рисование) и предложения о том, что Rx подходит для асинхронных приложений/операций, таких как вызовы веб-сервисов.Создание клиентского API REST с использованием реактивных расширений (Rx)
Я работаю над приложением, где мне нужно написать крошечный клиентский API для службы REST. Мне нужно назвать четыре конечных пункта REST, три, чтобы получить некоторые справочные данные (аэропорты, авиалинии и статусы), а четвертый - это основная услуга, которая даст вам время полета для данного аэропорта.
Я создал классы, разоблачающие три справочных служб данных, а также методы выглядеть примерно так:
public Observable<IEnumerable<Airport>> GetAirports()
public Observable<IEnumerable<Airline>> GetAirlines()
public Observable<IEnumerable<Status>> GetStatuses()
public Observable<IEnumerable<Flights>> GetFlights(string airport)
В моем методе GetFlights я хочу, чтобы каждый полет держать ссылку аэропорт это вылетающий из и Авиакомпания управляет полетом. Для этого мне нужны данные из GetAirports и GetAirlines. Каждый аэропорт, авиакомпания и статус будут добавлены в Dictionar (ie.e Dictionary), чтобы я мог легко установить ссылку при разборе каждого рейса.
flight.Airport = _airports[flightNode.Attribute("airport").Value]
flight.Airline = _airlines[flightNode.Attribute("airline").Value]
flight.Status = _statuses[flightNode.Attribute("status").Value]
Моя текущая реализация теперь выглядит следующим образом:
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);
}
Текущая реализация основана на ответ Сергея, и использует ForkJoin для обеспечения последовательного выполнения и что я ссылаться на данных загружаются перед полетами. Эта реализация является более элегантной, чем необходимость запуска события «ReferenceDataLoaded», как моя предыдущая реализация.
Ответ обновлен - также ознакомьтесь с этой веткой: http://social.msdn.microsoft.com/Forums/en/rx/thread/20e9fea1-304f-4926-aa02-49ed558a84f5 - показывает, как написать свой настраиваемая буферизация. –