Kafamı, Reaktif Uzantılar (Rx) için doğru kullanım durumları etrafında tutmaya çalışıyorum. Devam eden örnekler UI olayları (sürükle ve bırak, çizim) ve Rx'in web servis çağrıları gibi senkronize olmayan uygulamalar/işlemler için uygun olduğu önerileridir.Reaktif Uzantılar (Rx) kullanarak REST istemci API'si oluşturma
Bir REST hizmeti için küçük bir istemci API'si yazmam gereken bir uygulama üzerinde çalışıyorum. Bazı referans verilerini (Havaalanları, Havayolları ve Statüleri) almak için dört REST uç noktası, üçünü aramalıyım ve dördüncü, belirli bir havalimanı için uçuş sürelerini size verecek ana hizmettir.
Ben üç referans veri hizmetlerini açığa sınıflar oluşturduk ve yöntemler şuna benzer: Her Uçuş Havaalanı o kalkan oluyor bir başvuru tutmak istiyorum ve benim GetFlights yöntemde
public Observable<IEnumerable<Airport>> GetAirports()
public Observable<IEnumerable<Airline>> GetAirlines()
public Observable<IEnumerable<Status>> GetStatuses()
public Observable<IEnumerable<Flights>> GetFlights(string airport)
Uçuş çalışan havayolu şirketi. Bunu yapmak için GetAirports ve GetAirlines'ın mevcut olması gereken verilere ihtiyacım var. Her bir Uçuş, Havayolu ve Durum bir Dictionar'a (yani, Dictionary) eklenecektir, böylece her uçuşu ayrıştırırken referansı kolayca ayarlayabilirim.
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);
}
şu anki uygulama Sergey'in cevap dayanmaktadır ve sıralı yürütülmesini sağlamak ForkJoin kullanır ve Veri Uçuşlar önce yüklenen başvuru olun:
flight.Airport = _airports[flightNode.Attribute("airport").Value]
flight.Airline = _airlines[flightNode.Attribute("airline").Value]
flight.Status = _statuses[flightNode.Attribute("status").Value]
Benim şu anki uygulama şimdi buna benzer. Bu uygulama, önceki uygulamam gibi bir "ReferenceDataLoaded" olayını tetiklemekten daha zariftir.
Yanıtı güncellendi - ayrıca, bu konuya bir göz atın: http://social.msdn.microsoft.com/Forums/en/rx/thread/20e9fea1-304f-4926-aa02-49ed558a84f5 - nasıl yazılacağını gösterir özel arabelleğe alma. –