@jsakamotoさんからとてもナイスなフィードバックをTwitterでもらったので早速実装しました。
ODataによるデータ出力
上記URLでOData形式でデータを出力しました。後はUIを組み込めば過去のつぶやきを見放題!ぐへへ。UIをどうやってつくるかは考え中。
購読しやすい形式にはマッピングしてないので、購読用途には向いてないです。
OData と AtomPub - WCF Data Services を使用した AtomPub サーバーの構築
↑この辺で直接購読しやすくマッピングをしてみようかとも考えて動かしてみたんですが、なんか用途が違う気がしてきたのでやめました。購読用Feedは需要があれば別途用意します。
つぶやいた内容を直接見れる(パーマリンク化)
続いて、つぶやき内容をブラウザから直接見れるようにするパーマリンク化。これまではiPhoneでの利用を想定してたので、トップページからリンクをたどって見る方法しかなかったですが、ブラウザにURLを入れて直接アクセスできるようにしました。ODataと合わせて使うのがいいかも。
トップからたどっていくと、つぶやきページの一番下にPermalinkというリンクがあるので、そこに指定されてるURLがパーマリンクです。
PCで見ると↑こんな感じです。
上記の場合 http://guttokita.cc/Tweets/27 がパーマリンク。
技術的な話
そもそもEF CodeFirstでデータアクセス層を実装してるので、すんなりとはODataになってくれませんでした。ちょびっとだけ手を加える必要があります。というのも、CodeFirstのデフォルトの挙動がプロキシクラスを生成するので、WCF Data Servicesから見たときにIQueryableに見えないといわれて怒られます。
サーバーで要求の処理中にエラーが発生しました。例外メッセージは 'データ コンテキスト型 'SiteContext' に、要素型がエンティティ型でないトップレベルの IQueryable プロパティ 'Accounts' があります。IQueryable プロパティがエンティティ型であることを確認するか、データ コンテキスト型に対して IgnoreProperties 属性を指定して、このプロパティを無視してください。
EF CTP4 Tips & Tricks: WCF Data Service on DbContext « RoMiller.com
CTP4ですがここを参考にObjectContextのオプションでプロキシを生成しないように抑制しておく必要があります。
CTP5での書き方は↓こう。
protected override ObjectContext CreateDataSource() { var db = new SiteContext(); ((IObjectContextAdapter)db).ObjectContext.ContextOptions.ProxyCreationEnabled = false; return ((IObjectContextAdapter)db).ObjectContext; }
SiteContextっていう名前でDbContextを作ってます。
リレーショナルなテーブルだとこれでもちょっと使いにくくて、フラットで十分じゃないかと思うわけです。であれば、ViewをDBに定義してそれをFeedにしたほうがいいと思ったんですが、CodeFirstでViewってどうするんでしょうね。どうやら普通にエンティティクラス書いてDbSetでDbContextに定義すればいいみたい。でも、それだとテーブル作られちゃうじゃないですか。テーブルをつくるな宣言ってどうするんでしょうね。よくわかんないな~。NotMappedはテーブルには適用されない。しょうがないのでInitializerのSeedでDrop TableとCreate Viewをするという暴挙にでました。何かしら方法があるといいんだけど。
ちなみにODataということは、いろんなフィルターや射影し直せるというわけで、自分のつぶやきの最新3件取得とかも簡単です。
http://guttokita.cc/feed.svc/Tweets?$filter=UserName eq 'takepara'&$orderby=CreateAt desc&$top=3
うっひょ~い!
URLに指定できるクエリオプションは以下のページをどうぞ