WindowsPhoneの非同期処理の理念は伝わっているけど、、、 C#の言語理解が足りないから実装方法がわからない。 GoogleのAPIの実装を見た時に「うわっこんな実装になるのか。。。なんで?」って ところが理解できてなかったと再度思うことになった。
何がしたいか?
WindowsPhoneでGoogle+にアクセスしたい。 そこで処理を書いていくと 1.OAuthの部分(+その後の処理)をGUIと切り離したいのでライブラリ化しておきたい。 -だけどアクセスは非同期処理になるので、データが返ってくるタイミングがわからない。 2.なのでそのデータをどう使うかはPhone側関数の処理にしたい。 3.その関数の引数はJsonの生データ(string)ではなくて、型が決まった状態で受け取りたい。 -Newtonsoft.JsonのDeserializeObject()を呼び出すのでT型で呼び出したい。 この位の知識で実装してたら、あれ?あれ?って感じになったのでまとめておく。
レスポンスデータ取得後の呼び出し
最終的にT型で関数を呼び出すという目標に対して、 レスポンスが受けとったデータを呼び出すので
public IJsonResult target; string = {レスポンスデータ}; target.SendJson(data);
みたいな実装が必要なのでまずインターフェースを定義してみた。 これは生成時にT型が必要なのですが、呼び出し時にtargetをインスタンス化する為です。
SendJson()の実装
で、SendJson()の実装はジェネリックを利用して
public class JsonResult<T> : Ziro.OAuth.IJsonResult where T : JsonData { private Action<T> action; public JsonResult(Action<T> lambda ) { action = lambda; } public void SendJson(string responseData) { //データを解析 T jsonData = JsonConvert.DeserializeObject<T>(responseData); action(jsonData); } }
として、文字列をT型でデシリアイズして、それを引数にaction()を呼び出しています。 action()は引数がT型のラムダ式を引数に持つ式をコンストラクタで受け取ってます。
リクエストの呼び出し
private void GetMe() { oauth.target = new JsonResult<GooglePlusData.Person>(GetPeople); oauth.GetPeople("me"); } private void GetPeople(GooglePlusData.Person person) { //元のスレッドでメイン画面に遷移 this.Dispatcher.BeginInvoke(() => NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative))); }
って感じでOKです。 GetPeple()はUrlを作成して、GETしています。 これでJsonResultの生成時に型情報と受け取りの実装を渡します。
総括
一瞬、OAuthを直接行う部分のインスタンス化を行う時にT型を使おうとしたのですが、 アクセストークンをやり取りするのがだるかったのでこうしています。 ※おそらく後で分散ストレージを使うので、そうしなくても良かったかな?とも思ってます。 こうしておくことで多分他のOAuthを作りたい感じになった時に楽になるかな。。。と勝手に思ってます。 ここに行くまでブヒーって感じでした。 C#の知識が乏しい状況での実装なので、本当にこれでいいのかも不明です。 JavaScript辺りのゆるふわな感じと、Javaの静的な感じが実現できていて素晴らしいなぁ。 結論としては、、、λカワイイ。。。
0 件のコメント:
コメントを投稿