てぃぐれのプログラマwiki

ワクワクに従う

これがDTO!? 役だった話【C#】

経緯

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.lng = r.lng;
        this.icon = r.icon;
        this.address = r.address;

    }
  //エンティティ経由のデータ
    public SpotDTO(SpotEntity SpotEntity){
        this.lat = SpotEntity.lat;
        this.lng = SpotEntity.lng;
        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などして)出すことができる。