経緯
tigretic.hatenablog.com
以前、DTOとはというタイトルでざっくり紹介したデザインパターン。自分で書いたものの、ちょっとしっくりこなかった。
自分はSQLをがりがり書くとこにいたせいか、モデルクラスからさらにDTOのクラスにして成形するというがあまり腑に落ちなかったのだ。
SQLで出すときはすでに、出したいデータになっているからだ。
DTOは確かに、SQLを書かないような開発手法では有効的なのかもしれない。
異なるデータを一か所にまとめたいときに役立った
外部APIを叩いてjsonで値を持ってきて、クラスにぶち込む必要があり、それをさらに、DBのデータと合わせる必要があった。
Text Search | Places API | Google Developers
googleさんに参考のjsonが落ちていたので、これを基にすると。ほしいデータがresultsの中にあるとする。
そして、これは、どこかで、DBのデータと一致させたい。
jsonの値を格納するためには、まずjsonに合わせたクラスを作成する。
Convert JSON to C# Classes Online - Json2CSharp Toolkitここを利用。
そして、欲しい情報にそぎ落とした。
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Root
{
public List<Result> results { get; set; }
}
public class Geometry
{
public Location location { get; set; }
}
public class Location
{
public double lat { get; set; }
public double lng { get; set; }
}
public class Result
{
public string formatted_address { get; set; }
public Geometry geometry { get; set; }
public string icon { get; set; }
public string name { get; set; }
}
これはgoogleからのapiから持ってきたものだが、これをDBのエンティティと一致させたい。
//DBの値を格納
public class SpotEntity{
public double lat {get;set;}
public double lng {get;set;}
public string icon { get; set; }
public string address { get; set; }
public int ins_person_id{get;set;}
public DateTime ins_at{get;set;}
public int upd_person_id{get;set;}
public DateTime upd_at{get;set;}
}
//ここでまとめる
public class SpotDTO{
//
Json経由のデータ
public SpotDTO(Root.Result r){
this.lat = r.lat;
this.icon = r.icon;
this.address = r.address;
}
//エンティティ経由のデータ
public SpotDTO(SpotEntity SpotEntity){
this.lat = SpotEntity.lat;
this.icon = SpotEntity.icon;
this.address = SpotEntity.address;
}
public double lat {get;set;}
public double lng {get;set;}
public string icon { get; set; }
public string address { get; set; }
}
上記のようにEntity経由とJson経由でデータをそろえることができる。
DTOのことを考えながらJsonと戦っていたら閃いた瞬間でした。
こうすることで、SpotDTOの配列を作成し、一か所の場所できれいに(foreachなどして)出すことができる。