我試圖讓我的頭圍繞反應式擴展(Rx)的正確用例。不斷出現的示例是UI事件(拖放和繪圖),以及Rx適用於異步應用程序/操作(如Web服務調用)的建議。使用反應式擴展(Rx)創建REST客戶端API
我正在研究一個應用程序,我需要爲REST服務編寫一個小型客戶端API。我需要撥打四個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詞典)中,以便在解析每個航班時輕鬆設置參考。
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 - 顯示如何寫你的定製緩衝。 – 2010-05-16 05:15:19