Page 1 of 1

IObservable REST klient

Posted: Sun Aug 12, 2012 20:21
by BEZY
Zdravím,

chystám se napsat knihovnu pro práci s webovým serverem (typická služba, která poskytuje nějaká data), který má dostupné REST rozhraní. Jelikož jsem si docela oblíbil Reactive Extensions, tak chci využít je a na různé Get... metody vracet IObservable. Nevim ale úplně přesně, jak tu knihovnu uchopit - jakým způsobem ji navrhnout. Vidim několik možností

1) Metody by vracely IObservable<IEnumerable<Typ>>. Je to logické, protože rest požadavek ihned vrátí celou kolekci, tak se tato kolekce volajícímu rovnou předá a ihned se zavolá OnCompleted(), takže by se např. při stránkování musel znovu volat Subscribe()

2) Metody by vracely IObservable<Typ>. Po Subscribe() by se IObservable inicializovala a zůstala by aktivní až do konce běhu programu. Pro stránkování by pak např. mohly existovat další metody, třeba GetNextBatch apod... které by data už sypaly do existujícího proudu.

3) Vykašlat se na IObservable a využít eventů (podle mě nejblbější řešení)

4) Něco jiného? Plus další věc - má cenu použít IObservable na Set... metody (čti REST POST metody, které vrací např. jen jednu strukturu, nebo obecně 1 hodnotu) nebo je to overkill?

Jestli máte někdo zkušenosti s návrhem podobného klienta, podělte se o zkušenosti, já zatim moc zkušeností nemam a využíval jsem jen "naivní" přístup, chci ale navrhnout něco elegantního :) Díky za vaše názory

IObservable REST klient

Posted: Wed Aug 15, 2012 13:56
by Igor Kulman
Trváš na vrátení Typu? Ja som si zvykol, že Restsharp mi vracia IRestRespone a s tým si už naložím, ako uznám za vhodné a často sa rozhodujem podľa HTTP kódu. Môj návrh je preto vracať niečo na štýl IObservable<IRestResponse> a samozrejme spôsobom číslo 2. Spôsob 1 je blbosť, u IObservable ide o to, že sa raz subscribnem a pri každom volaní z webu dostanem odpoveď (ako napríklad pri SOAP službách). Robiť x subscriptions keď to volám x-krát je blbosť. Čo tak spraviť len Rx nadstavbu nad Restsharp?

IObservable REST klient

Posted: Wed Aug 15, 2012 14:13
by steelspace
Poměrně zajímavá alternativa by mohly být Reactive Extensions (Rx) http://stackoverflow.com/questions/2833 ... ensions-rx" onclick="window.open(this.href);return false;

IObservable REST klient

Posted: Wed Aug 15, 2012 14:15
by Igor Kulman
steelspace wrote:Poměrně zajímavá alternativa by mohly být Reactive Extensions (Rx) http://stackoverflow.com/questions/2833 ... ensions-rx" onclick="window.open(this.href);return false;
??? Veď sa o Rx bavíme celý čas.

IObservable REST klient

Posted: Wed Aug 15, 2012 14:37
by BEZY
Vracet přímo IRestResponse je zajímavej nápad, zamyslim se nad tim :)

Jinak jsem stejnou otázku položil i na SO, zatim tam jsou 2 odpovědi, tak můžete klidně komentovat i tam

http://stackoverflow.com/questions/1193 ... est-client" onclick="window.open(this.href);return false;

Doporučení je tam ale opačný - co Subscribtion, to REST request..

IObservable REST klient

Posted: Wed Aug 15, 2012 15:16
by Igor Kulman
Asi som sa zle vyjadril. Myslel tak, že 1 subscription = 1 "zdroj". Teda ak volám stankovaný zdroj by bol vďaka tomu na 1 subscription. (requesty na rôzne "zdroje" majú rôzne subscriptions)

IObservable REST klient

Posted: Wed Aug 15, 2012 16:08
by BEZY
Jasně, to jsem pochopil. Takže zavolat pro každej zdroj Subscribe() a pokud by volající chtěl například další data / další stránku, tak zavolat např. GetNextBatch, prostě ten druhý způsob. Ono to asi i dává větší smysl, protože pokud bych chtěl, aby se např. ta knihovna serveru dotazovala automaticky, třeba přes Timer, tak je blbost aby ta Observable sekvence ihned po vykonání požadavku skončila. Thx