tekitoumemo’s diary

C#、ASP.NET MVC、その他の言語やらツールのブログを書いています。たまに車や雑談するときがあります。

【C#】AutoMapperのCreateMapが使えない!?

AutoMapper が5.x系から静的メソッドが使えなくなりましたのでその話。CreateMapがエラーになってて「AutoMapper CreateMap 使えない」で検索しても出てこなかったのでここで書こうかと。

AutoMapperとは?

automapper.org
モデルを簡単にマッピング出来るライブラリです。ASP.NET MVCはViewにモデルを渡す必要があるのでかなり重宝します。データ抽出したモデルをビューモデルに追加するときとか便利!

どこが変わったのか

静的メソッドが動的になり、スレッドセーフになったりパフォーマンスが改善されました。5.x系以前の使い方は以下の通り。

using AutoMapper;
// Mapperを作成
Mapper.CreateMap<Model1, Model2>();
Model1 model1 = new Model1 ()
{
  Name = "saito",
  Age = 28
};
// Model1のデータがModel2の型でマッピングされる
var model2 = Mapper.Map<Model2>(model1 );

そして5.x以後の使い方は以下の通り。

// Mapするモデルの設定
var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Model1, Model2>();
});
// Mapperを作成
var mapper = config.CreateMapper();
// Model1のデータがModel2の型でマッピングされる
var model2 = mapper.Map<Model2>(model);

ラムダでマップするモデルを設定してMapperを作成と以前と比べてコード量が増えましたが、作者は静的メソッドで作成してしまったことについてずっと後悔しており、以下のリンクでその内容について述べてます。
Removing the static API from AutoMapper | Jimmy Bogard's Blog
TOEIC100点も取れない僕が解釈した内容だと
ずっと静的メソッドで作ったことを後悔していて、さらにJeffrey PalermoっていうHeadspring Systems社の最高技術責任者に「静的メソッドじゃだめじゃね?」って言われて直してたら動的で行けそうだったから完全移行するよ!って内容(だと思う)です。

正直スレッド問題とかパフォーマンスの問題は直面することはなさそうだけど、staticでインスタンスが作られるのは怖いよねってことでアップデートするのはおすすめです。

【C# + ASP.NET MVC】HTMLヘルパーのメリット、デメリット

久しぶりに技術ネタ。

HTMLヘルパーは非常に便利でスマートに書けるのですが、実際に運用していてデメリットも多いので、そこらを書いていきます。

HTMLヘルパーとは?

ASP.NET MVCのフォームレンダリングです。簡単に言うと冗長になっちゃうビューに記述するフォームロジックを簡単にかけまっせ!というやつです。

メリット

簡潔にプログラムっぽく書ける。テストを書ける。独自ヘルパーを作れる。書き方例を以下に記載する。

// リスト作成
model.SelectListItem = model.Select(m => new SelectListItem
 {
    Text = m.Name,
    Value = m.Id.ToString()
 });
// View側 model.Idと一致した行がデフォルト値となる
@Html.DropDownListFor(model => Model.Id, Model.SelectListItem, "選択してください")

model.SelectListItemを生成してView側にレンダリングしたいモデルをラムダで指定するとselect、optionタグを生成してくれるから簡潔に書ける。最高。

デメリット

デザイナーとのやりとりが難しい。HTMLヘルパーの記述方法はデザイナーさんは知らないので「触らぬ神に祟りなし」ばりに弄ってくれない。

  @Html.TextBoxFor(model => model.name, new { size = 100, maxlength = 255})

上記の例でmaxlengthを300にしたいときに依頼される。クラス指定するとき依頼される。この程度はほんと小さなことなんですが、チマチマ依頼されると結構な工数になる。デザイナーの手も止まってしまうし、非常に良くないです。bootstrapを使うとき、HTMLヘルパーに直すのがめんどくさい!

まとめ

HTMLヘルパーは非常に良く、僕も大好きなのですが、運用していく上で工数が掛かったりスピード感が思うように出なかったりなど本末転倒になりかねないので、デザイナーとやっていくならあまりオススメは出来ないです。ただし、経験者や暇なデザイナー(学習に時間割けれる)がいる現場であれば使うべきだと思うので、そこは臨機応変に対応していければと思います。

最後に

Dapperのときも書いたのですが

開発者にとって使いやすい、簡単っていうのは非常に重要だと思います。最近思うのはプログラムが好きでないエンジニアの方が非常に多いということ。使ってもらうことに喜びを感じるエンジニア、仕様を決めて作ってもらうことにやりがいを感じるエンジニアが多く、多少冗長になっても簡単でわかりやすい仕様のライブラリを使うことはチームで開発する上ではかなり重要だと思いました。

お金の使い方がわからないやつなんなの?

嫁の愚痴シリーズ第2弾

嫁はほんとうにお金の使い方が下手くそ。っかあったら全部使う。こういうお金の使い方してるとなくなるよ!ってのを教える。

すぐ浮かれる

いいことがあったから贅沢!友達と遊びに行くからこのご飯食べに行く!これが不便だからこれ買う!

まず懐考えてからものを買うよね。月にどれだけのお金が使えるか把握して多少なりの計算してくれねーかな?記帳するだけで全然変わるんだけど。

ないものをチートで増やす

驚きまくったのが引っ越し。さすがに僕も貯金に手をつけるの嫌だったし二人の引っ越しだから7:3ぐらいで割ったけどそれがまぁ驚き。

俺「少し出してくれる?全部はさすがにしんどい」
嫁「いいよ!いくら必要かな?」
俺「○十万ぐらいかな?あとは出すよ」
嫁「わかった!」
俺「っかそのお金あるの?」
嫁「ない!お父さんに借りる!」

は?

っか何年働いてんじゃ馬鹿たれ。一人暮らししてて車買った俺ですら余裕であるわそんぐらいの金。そのあと怒ったらガン泣き。なんなんこいつ。 一生返さない模様。

御礼したがり

これは良いところなのかもしれない。
婚約指輪を買った時の話

嫁「ありがとう!ずっと大事にするね!」
俺「うん、余裕で大事にして」
嫁「御返ししなきゃ!なにが欲しい?」
俺「ホイール」
嫁「時計とかスーツとか買おう!」
俺「お金あんの?」
嫁「ボーナス!」

そこをあてにしてんのか。。うちの会社ほとんどボーナスないだろ。。

※結局、ボーナスほぼなかったのでお母さんが御礼するという始末。。

いいとこのお嬢さん

まぁ社長令嬢とかそんなんじゃないけど、有名大学出でそれなりの生活をしてきた人。周りが超大手とか外資とかザラなので感覚が狂ってるっか嫁がおかしい。超大手とか外資とかお金ガンガン使ってると思ってるから普通にバカすぎ。

そういつ奴らはちゃんと考えるから!

お金がないのを結婚式のせいにする

嫁「今月は結婚式が多かったから〜」
嫁「結婚ラッシュなの!」
嫁「出産祝いとか!」
嫁「誕生日も!」

俺もあるわ。月3回あったときはしんどかったが、計画できんだろ馬鹿たれ。


お金は俺が管理しよう。。

エクセルやアナリティクスぐらいどの職種でも扱えるようにして欲しい

愚痴、かなり愚痴。

小さな会社なので分析系もちょくちょくやるんだけど、エクセル使えない、アナリティクス見れないで結構ウンザリしてる。エクセルは使いたくないけど、他業種の人との共通フォーマットだからしゃーない。

sumしか使えないやつなんなの?

要求されたデータを出して、「このデータからこういう傾向あるものを見たいからデータ出して」ってよく言われる。マクロとは言わんが、関数ぐらい使えるようになれや。一個一個見てる光景に耐えられなく、僕がエクセルするハメに。

ここの離脱はどうなってんの?

俺はアナリティクスじゃねぇ。覚えてねぇわ。離脱ぐらい簡単な条件だったら一瞬で見れるわ。っかアカウント持ってんのに調べるとか考えねぇの?アナリティクスの結果をエクセルにハリハリしてるとかもぅ勘弁してくれ。。

何も出来ないのにガタガタ言う

データを出せないと割り切ってるから、人の分析結果に対してガタガタ言う。

俺「結果、直帰と離脱が○%だから○人の機会損失してます」
他「この結果本当なの?ここは気にならないって言ってたよ!」
俺「いや、実際にデータとして出てるからこういう傾向は少なくともあるよ。。」
他「そこじゃなくて他に原因がー」
俺「じゃあそこの原因調査お願いします。」
他「調べて!」

まじなんなのこいつ。

まじ、僕レベルの分析結果なら中学生でも出来るわ!

そもそもエクセルって誰でも使えるんじゃないの?

グラフ出せないとか集計出来ないとか話にならないから。就活時によく言ってるコミュニケーション能力とかも大事だけど、自ら考えて工夫する力ってかなり大事だと思うんだけど。

コミュニケーション能力とはなんなのか?

コミュニケーション能力あるから他にはいらない!とか豪語してるけど、ベラベラ喋って文句たれてるだけじゃなにも力にならんわ、邪魔なだけ。「分析してるから!」とか言ってるけど、客の言ってることを噛み砕いて適当いいやがって。

マジでなんなの?

これ





嫁に対する愚痴です。

【C#】Listになってるクラスのプロパティを一行で変える

小ネタ、めっちゃ小ネタ。みんな大好きLINQを使います。

Listのクラスのプロパティを一括で変えたいってときがあると思います(割と)そこでプログラム書きたくない主義の僕はふと思いつき調べたんで書きます。

まずは普通に一括でhoge1を1にします。

public partial class Hoge
{
    public int hoge1 { get; set; }
    public int hoge2 { get; set; }
    public int hoge3 { get; set; }
 } 

var models = new Hoge();
// モデル生成部分は割愛
foreach(var m in models)
{
     m.hoge1 = 1;
}

なんかつーか微妙だよね。このレベルだったら一行で描きたいよね。ここではLINQを使います。

public partial class Hoge
{
    public int hoge1 { get; set; }
    public int hoge2 { get; set; }
    public int hoge3 { get; set; }
 } 

var models = new Hoge();
// モデル生成部分は割愛
models.Select(m => m.hoge1 = 1).ToList();

はい、一行で終わりです。ここでのポイントはToListにしないとモデルの値が変化しないこと。LINQの評価はIEnumerableに要求があったときにされるので何かしら要求しないとただ単に内包したオブジェクトが出来上がるってだけ!

さらにif文とかでなになにだったら値を入れるみたいなことをしたいときあると思います。それが下の例

// 動確してません!スマホで記事書いてるし!!
models.Where(m => m.hoge2 == 1).Select(m => m.hoge1 = 1).ToList();

hoge2が1の場合だけhoge1を1にする(1って言い過ぎだろ。。)一行で終わり。

このようにメソッドチェーンで繋いで結果を得ることが出来ます。今回のケースでなくてもLINQではいろんなことが出来るのでどんどん使っていきましょう!

※乱用はダメ。ただのforループって認識でいると乱用してる恐怖がわかるはず

【C# + MVC】CustomAttributeでパラメータを扱う

技術ネタ。

CustomAttribute便利ですよね。プログラムは大好きなんだけど一行でも少なく書きたい主義の僕にはひじょーに素敵な機能です。

パラメータでちょっと動きを変えたい!セッションで持つほどじゃないけどちょっとだけ!!

ってことは割とある?と思うので小ネタを。Areas使うときなんかは結構嬉しいと思う。

まずは普通のCustomAttribute

// HogeController.cs
[HogeAttributes]
public ActionResult Index(string param)
{
    return View();
}
// HogeAttributes.cs
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    // いろんな処理        
    base.OnActionExecuting(filterContext);
}

この例でいくとparamの値によっては違うとこにリダイレクトさせたい!とかあると思います。

その例が以下です。

// HogeController.cs
[HogeAttributes]
public ActionResult Index(string param)
{
    return View();
}
// HogeAttributes.cs
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    // Parameters can be acquired with custom attributes.
    var param = filterContext.ActionParameters["param"];
    // いろんな処理        
    base.OnActionExecuting(filterContext);
}

ActionExecutingContextのActionParametersにメソッドの引数のパラメータ名を渡すと取得出来ます。keyvalueで入ってるので引数の名前変えると落ちます。

このやり方が良いかはわからんが、割と便利なのでオススメです。

【C#】Dapper使ってりゃ間違いないよ

だっぱー


C#のデータアクセスはいっぱいあるけどチームで使うなら結構最適なORマッパーじゃないかなと思い始めてるので、Dapeerの良さについて語ります。

ちなみにチームと言っても色んな人種(年齢やら経歴やら)がいるチームにDapeerは最適だと思ってるのでORマッパーマッパーしてる人ばかりだったらPetaPocoの方が良いです〉ぺたぽこ
そしてMS標準のEntity Frameworkは開発当初から捨て去りましょう。
型付DataSetとか記憶から消し去りましょう。


それではDapperの良いところを語って行きます。

早い、とにかく早い


この記事を見てもらうと一目瞭然。EFとか終わってるでしょ。EFとかでもやっていけるよ!って人に言いたい。パフォーマンスの調査をするときにどっちが原因かわからんでしょ。無駄に工数かかるし、パフォーマンス調査の結果、「だっぱー」だね!ってなるんだからとりあえず選んどいて損はない

実績豊富

ラニさんが使ってる。

大型サイトでの実績があり、安定感バツグン。シンプルってのはこういうとこが良いね。無駄な調査しなくて良いし無駄にStackOverFlowを漁らなくて良い。

※CEOの河合さんに会ったことあるけど、天才。恐ろしいぐらいオタク。本当に一緒にお仕事させて頂きたい。

SQLを結構書く

これは賛否両論、むしろ生SQLを書くのは良くない風潮があるんだけど、40代以上の人はちょっと抵抗ある人が多いっぽいから生SQL書けるって良いなと思った。SQLは必ず通る道で誰でも知ってると思うので、学習コストが低いってかなり良いと私は思います。ORマッパーはデータアクセスのめんどいとこを差っ引いて使えるってのが魅力だけど、チーム全体で使えなければ開発効率もクソもないかなと思ってるんで生SQLを書くのは否定しません(2017/11月現在)。でもね、クエリビルダーのとかその他諸々の良さは知ってる、来月あたりに人間変わったように否定してるかも笑

daynamicが最強

ORマッパーの三種の神器(もっとある)としてデータマッピングがあるんだけど、むしろデータマッピングすらいらないじゃんって仕様がC#にはあります。C#コンパイラ言語なんだけど、.Net4.0からdaynamicが使えます、要はインタプリタが使えるので、マッピングしなくても使えます。無駄なクラス作る必要ないし、型を変更したときとかクソ楽ってか何もしなくて良いレベル。
こんな感じで使える。

dynamic dynamicObj = connection.Query("SELECT id, name FROM table1 LIMIT 1").FirstOrDefault();
Console.WriteLine("Id: {0}", dynamicObj.id);
Console.WriteLine("Name: {0}", dynamicObj.name);

ヤバくね?
インテリセンス使えんとかコンパイラでエラー検知出来ないとかタイポでバグるとかいろいろあると思いますが、テストは必ずやってるのが当たり前だと思うので、悪い点が見つかりません。C#はこんな感じで小賢しい天才機能があるので大好きです。

Dapperはあくまで経験が多い人も少ない人もいるチームで円滑に開発を進めるためのライブラリなので、技術好きで上級者は他のライブラリが良いかもしれません(僕も自分で作るならDapper使いません)初心者向けではありますが、いろんなこともできるので奥が深くて使いがいがあるライブラリなので、迷ったら是非使ってみてください。

後日談
Entity Frameworkを見てみると全然悪くない。っか良い要素が多過ぎて知らないくせにいきがってた感があります。批判するときはちゃんと調べましょう