『プログラミングASP.NET MVC 第3版』を読んだ

プログラミングMicrosoft ASP.NET MVC 第3版ASP.NET MVC 5 対応版 (マイクロソフト公式解説書)

ASP MVC 5の解説書。初歩的な解説も載っていますが、それ以上に「ASP MVCを使って良いアプリケーションを作るにはどうすればよいか」ということを詳しく書いてあります。

以下、目次

■第1部 ASP.NET MVCの基礎
第1章 ASP.NET MVCのコントローラー
第2章 ASP.NET MVCのビュー
第3章 モデルバインディングアーキテクチャ
第4章 入力フォーム
■第2部 ASP.MVCのソフトウェアデザイン
第5章 ASP.NET MVCアプリケーションの機能
第6章 アプリケーションのセキュリティ
第7章 ASP.NET MVCコントローラーの設計上の注意点
第8章 ASP.NET MVCのコントローラーのカスタマイズ
第9章 ASP.NET MVCでのテストとテスタビリティ
第10章 ASP.NET Web APIエグゼクティブガイド
■第3部 モバイルクライアント
第11章 効果的なJavaScript
第12章 モバイル対応のWebサイトの作成
第13章 マルチデバイスサイトの構築

500ページ長と大きめの本ですが、本書の中でも力を入れて読むべきなのは、第2部「ASP.MVCのソフトウェアデザイン」です。
特に、第7章「ASP.NET MVCコントローラーの設計上の注意点」には、さまざまな設計上のヒントが散りばめられています。

たとえば、MVCのControllerは、その名の通りの「Controller(さまざまなオブジェクトを統合して管理する責務)」ではなく、「Coordinator(さまざまなワーカーサービスの調整を行う責務)」として実装したほうが、シンプルに実装できる、といった指摘です。

もう1つ、個人的に気になったテクニックが、ビューモデルです。ビューモデルの概念は、WPFなどでは当たり前に用いられているようですが、WebのMVCの世界ではそれほど一般的ではありません。しかし、ビューモデルを使うことで、DBを操作するためのモデルクラスと、ビューに表示するデータを保持するだけのビューモデルクラスを分離することができます。このような分離は、単純なアプリケーションでは手間がかかるだけでメリットは薄いでしょうが、データベースのデータを画面上に表示するための整形処理等が必要な場合には、ビューモデルを活用することで、個々のクラスの実装を簡潔に保つことができます。

ASP MVCの入門者が最初に読む本としては適していませんが、2冊めに読む本としては良いと思います。

この本の著者(Dino Esposito氏)の本は良さそうだなと思ったので、以下の書籍も購入しました(ちょうど、Kidleで50%ポイント還元やってたので)。

.NETのエンタープライズアプリケーションアーキテクチャ第2版 .NETを例にしたアプリケーション設計原則

『ASP.NET MVCプログラミング入門』を読んだ

ASP.NET MVCプログラミング入門 (マイクロソフト関連書)

本書のタイトルは『ASP.NET MVCプログラミング入門』ですが、実際に扱っているフレームワークは「ASP.NET Core」です。

従来のASP.NETと、ASP.NET Coreの違いはわかりづらいですが、以下の表が参考になります。

ASP.NETとASP.NET Coreの相違点
名前 ASP.NET4.6 ASP.NET Core 1.0
正式対応OS Windowsのみ Mac/Linux/Windows
対応プラットフォーム .NET Frameworkのみ .NET Framework/.NET Core
IISへの依存
MVC/WebAPI/WebPages機能 ○(別クラス) ○(統合済み)
WebForm機能 ×
WebService機能(asmxやWCF) ×
オープンソース開発 ×

出典: ASP.NET Coreの概要を理解してセットアップしよう

ASP.NET Coreの特徴は、(1) オープンソースである (2) クロスプラットフォームで動作する の2点です。
また、ASP.NETには、いくつかのサブフレームワークがありますが、Web Formという、従来のASP.NETの中核を成していたフレームワークはASP.NET Coreには含まれません。
ASP.NET Coreの中心は、MVCという比較的新しいフレームワークです。

ASP.NET Coreが出たからといって、従来のASP.NETがすぐに廃止されるわけではなく、両者は並行して開発されていくようです。

ASP.NET Core雑感

『ASP.NET MVCプログラミング入門』を参考に、ASP.NET CoreのMVCとWeb APIを軽く触ってみました。
私が仕事で主に使っているのはPHPのWebアプリケーションフレームワーク(Symfony, Laravel, Phalcon等)で、その他にある程度時間をかけて学習したフレームワークとしてはRuby On Railsがあります。
ASP.NET CoreのMVCは、これらのフレームワークと非常によく似た作りになっています。
以下は、dotnet new -t webコマンドで作成した直後のMVCアプリケーションのディレクトリ構成です。

ルート直下にControllers, Modles, Viewsが存在するという、わかりやすいディレクトリ構造になっています。

コントローラー

コントローラーは以下のような感じです。

C#らしさを感じるのは、非同期のアクションが簡単に書ける点です。

↑で注目すべきは、メソッドのシグネチャにasyncキーワードがついている点です。
_signInManager.PasswordSignInAsync()は非同期処理なので、いつ結果が返ってくるかわかりません。
そこで、このアクション自体を非同期にして、結果が帰ってきたタイミングでレスポンスを返せるようにしています。

PHPやRailsだと同期処理が当たり前だったので、カジュアルに非同期処理が使えるのはすごいなーという感じがします。

モデル

ASP.NET MVCでは、Entity FrameworkというORマッパーを使用します。
(ASP.NET Core用のものはEntity Framework Coreという別ライブラリですが、基本的なアーキテクチャやAPIは同じはず)

Entity Frameworkは、Data Mapperパターンに基づいたORマッパーです。
特徴は、データベースのテーブルに対応するクラスを、特定のクラスを継承しないPlainなクラスとして実装する点です。

↑のようなクラスから生成されたオブジェクトに保存されたデータを、DbContextというレイヤーを介してデータベースのpersonテーブルに永続化します。

Webアプリケーションフレームワークの世界では、Active Recordパターンに基づいたORMが多いですが、Data Mapperに基づいたORMも根強い人気があります。
JavaのHibernateが代表格ですが、その他の言語でもPHPのDoctrine、PythonのSQLAlchemyといった実装があります。

個人的には、Doctrineの使用経験があったため、Entity Frameworkは馴染みやすく感じました。

ビュー

Razorテンプレートエンジンというものを使用します。コードは以下のようになります。

自動エスケープやパーシャルテンプレート等、テンプレートエンジンにほしいものは大体入っています。

ビューテンプレートの内部ではC#のコードを書けます。
変数の定義のほか、DB問い合わせやファイル読み込みが可能です。
ビューにドメインロジックが入り込まないよう注意が必要です。

ルーティング

デフォルトでは、 /コントローラー名/アクション名 というルーティングになります。
ルーティングを独自定義する方法はいくつかありますが、個人的には属性を使用する方法が気に入りました。

↑のように、コントローラーのクラスやメソッドに対して属性を設定することでルーティングを行います。
Symfonyフレームワークにアノテーションルーティングという同様の仕組みがあり、アクションとルーティングの対応関係がわかりやすくて良かったので、同様の機能が提供されているのはいいなーと思います。

雑感まとめ

Microsoftのフレームワークということで、エンタープライズ的な、機能が山盛りで複雑なフレームワークを予想していたのですが、ASP.NET Coreの基本的な作りはかなりシンプルです。
MVCアーキテクチャのフレームワークを1つでも使ったことがあれば、ASP.NET Coreはすぐに使えるようになると思います。

書籍の感想

対象読者は「ASP.NET(ないしWindowsプラットフォームの開発)経験者で、ASP.NET MVC未経験」かなと思います。
Visual Studioを使ったことがない人がいきなり読むと、少しつらそうな部分があります。
(まあ、Visual Studioを使ったことがない≒C#経験が無い なので、そういう読者は先にC#とVisual Studioを覚えたほうがいいんでしょうが)

解説はかなり丁寧なので、C#の構文がわかっている人ならそれほど苦労せず読めると思います。

一点、残念だったのは、本書のほとんどの部分で、開発環境がWindowsを前提としている点。
Visual Studio 2015 Community + SQL Server 2014という組み合わせになっています。

付録としてLinuxでの開発環境構築方法は載っていますが、全体を通してWindows/Linux/Macのいずれでも実行可能な方法を載せてほしかったですね。
Visual Studio Code + SQLite/MySQL/PostgreSQLのいずれか という組み合わせならクロスプラットフォームで動くはずなので。

余談: Visual Studio Codeについて

Visual Studio CodeのC#拡張はすごいですね。
IntelliSenseに関してはVisual Studioと同程度に動作します。つまり、強力ということです。
フロントエンド技術のサポートはVisual Studio Codeの方が優れている部分もあるので、ASP.NET Coreで開発するなら、Windows + Visual Studioという組み合わせでなくてもやっていけそうな感じがします。