2014年8月19日

Visual Studio 2013の共有プロジェクトを使ってみる

そもそも共有プロジェクトって何ぞや?

普通なら、共有プロジェクトって何ぞ?
ってところから始まると思うんですが。
まあ、それはもう前提条件として。
もうすっ飛ばしてしまいます。

ソースファイルが増減しなければリンクでもよし

同じようなことは、「既存の項目」でファイルを追加する際に、「リンクとして追加」を選べばできます。
ソースファイルの増減がなければ、それでもいいかもしれません。

後からソースファイルが追加される可能性があるなら、共有プロジェクトにしておく方が楽です。
一々追加していかなくても済みますもんね。

ソースの共有

ソースを共有してうれしいことはといえば、サーバーとクライアントとで同一の構造にしておくことが楽、ということでしょうか。
特に、DataContractJsonSerializer使ってしまえばJSONでデータの共有ができますし。

たとえばこういうクラスがあるとします。

public class book_volume_data {
     public long book_volume_id { get; set; }
     public int volume { get; set; }
}
public class book_title_data {
     public long  book_title_id { get; set; }
     public string title_name { get; set; }
     public book_volume_data[] volumes { get; set; }
}
public class book_data_result {
     public int code { get; set; }
     public string error_message { get; set; }
     public book_title_data[] titles { get; set; }
}

まあ、こんな感じ。


これをNancyを使ってAPIにする場合、こんな感じのコードになるでしょうか。

Get[“/api/bookshelf”] = _ => {
      book_data_result result = new book_data_result() {
          code = 0;
          error_message = null;
      };
      /// データを読んでくる
      return Negotiate
          .WithModel(result)
          .WithMediaRangeModel(MediaRange.FromString("application/json"), result)
          .WithMediaRangeModel(MediaRange.FromString("application/xml"), result)
          .WithMediaRangeModel(MediaRange.FromString("text/xml"), result)
          .WithView(“Bookshelf”);
};

JSONとXMLに対応させてみたところで。


ところで、なぜプロパティ名が小文字ばかりでできているかというと。
NancyでNegotiate使ってJSON吐き出させると、プロパティ名の先頭文字のみ小文字化してくれるという機能があるからです。
これのおかげで、送出時と受信時でプロパティ名が不一致になってしまうのです。
しかも、[DataMember(“name”)]とかのAnnotationも効かないという始末。
なので、全部小文字化してあるのです。


共有化する部分は受け渡し用のクラスだけ


上記のbook_volume_dataとbook_title_data、book_data_resultを含めた共有ライブラリを作ってクライアントのプロジェクトに追加します。
そして、メインのプロジェクトから「追加」→「Shared Project Reference…」で共有ライブラリを追加しておくことでクライアントプログラムからも使えるようになります。


で、

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/json");
HttpResponseMessage msg = await client.GetAsync("http://foo.bar/api/bookshelf");
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(book_data_result));
book_data_result result = serializer.ReadObject(await msg.Content.ReadAsStreamAsync());

むーん。簡単簡単。
これでサーバー→クライアントとデータの受け渡しができちゃうのです。
で、共有プロジェクトを変更したら、双方をコンパイルしなおすだけ。


これ、相当便利です。

0 件のコメント:

コメントを投稿