ASP.NET MVC: MVCをする(モデルとコントローラ)

 MVCフレームワークをまじめに使うのは、このブログのASP.NET MVCが初めてだった。それまではPythonでDjangoをスルーしてGAE、FlaskやTornadoを使ってた。
 なんでMVCかってのは、メンテナブルなものにしたかったからである。かつてPythonで書いていたとき、MVCもなんも知らずにまず動かそうとコードを書いていた。そのせいでいわゆるコントローラが妙な肥大化をしたものを書いていた。

 MVCの自分なりの理解。WebでMVCはこうだろ的な記事を読んでいて、ファットコントローラはMVCの本来じゃないという指摘を見た。グサッと来た。
 ちょうどGAEのサンプルに、モデルに静的メソッドを書いてコントローラを軽量にまとめているものを参考にし始めた時期だった。そういう方法をとることで、コントローラに散在したDBデータ取得ロジックが、きれいに特定の箇所にまとめられた。そんな体験をしていたタイミングでMVCがどんなものかというのを読んだので、そのままそれを学びたいと思った。
 コントローラを太らすMVCもあるらしい。個人的にはそれをやるとコントローラ毎にDBへのアクセスを書いてしまいがちになり、DBアクセスのメンテナンスが面倒になってくる。そこでじゃあDBアクセスのロジックをどこに持ってくるのが妥当かと考えると、とってきたいデータのモデルを持つクラスに静的メソッドとして加えるのが一番しっくりくる。というわけでファットモデルがいい。

 コントローラの一例が下記のコード。このブログの各記事ページのためのコントローラ。
[Route("Article/{id:int}")]

public IActionResult Article(int id)
{
var entry = Entry.GetEntry(id);
if (entry != null)
{
ViewBag.entry = entry;
return View();
}
else
{
Response.StatusCode = 404;
return View("NotFound");
}
}

 パスから記事のIDを取得。記事があればその時点で持ってる情報をビューに渡す。あとはビュー側でモデルをごにょごにょして情報を取得しつつ、それを表示してもらう。IDに該当する記事がなければ404ページのビューへ。
 ビューからモデルを見るので、モデルはDBデータの各種取得方法が静的メソッドになったクラスになっており、それなり肥大化している。
 これでいいんかなと思いつつ考えたりいろいろ読んでいる。それでも以前のファットコントローラなものからすると、だいぶメンテナンスしやすい仕組みだと感じる。
comment: 0