本書のタイトルは『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アプリケーションのディレクトリ構成です。
$ tree -L 1 . ├── Controllers ├── Data ├── Models ├── Program.cs ├── README.md ├── Services ├── Startup.cs ├── Views ├── appsettings.json ├── bower.json ├── gulpfile.js ├── package.json ├── project.json ├── web.config └── wwwroot 6 directories, 9 files
ルート直下にControllers, Modles, Viewsが存在するという、わかりやすいディレクトリ構造になっています。
コントローラー
コントローラーは以下のような感じです。
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
C#らしさを感じるのは、非同期のアクションが簡単に書ける点です。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
// (中略)
}
// If we got this far, something failed, redisplay form
return View(model);
}
↑で注目すべきは、メソッドのシグネチャにasync
キーワードがついている点です。
_signInManager.PasswordSignInAsync()
は非同期処理なので、いつ結果が返ってくるかわかりません。
そこで、このアクション自体を非同期にして、結果が帰ってきたタイミングでレスポンスを返せるようにしています。
PHPやRailsだと同期処理が当たり前だったので、カジュアルに非同期処理が使えるのはすごいなーという感じがします。
モデル
ASP.NET MVCでは、Entity FrameworkというORマッパーを使用します。
(ASP.NET Core用のものはEntity Framework Coreという別ライブラリですが、基本的なアーキテクチャやAPIは同じはず)
Entity Frameworkは、Data Mapperパターンに基づいたORマッパーです。
特徴は、データベースのテーブルに対応するクラスを、特定のクラスを継承しないPlainなクラスとして実装する点です。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
↑のようなクラスから生成されたオブジェクトに保存されたデータを、DbContext
というレイヤーを介してデータベースのpersonテーブルに永続化します。
Webアプリケーションフレームワークの世界では、Active Recordパターンに基づいたORMが多いですが、Data Mapperに基づいたORMも根強い人気があります。
JavaのHibernateが代表格ですが、その他の言語でもPHPのDoctrine、PythonのSQLAlchemyといった実装があります。
個人的には、Doctrineの使用経験があったため、Entity Frameworkは馴染みやすく感じました。
ビュー
Razorテンプレートエンジンというものを使用します。コードは以下のようになります。
<ul>
@foreach (var item in Model) {
<li>
<a asp-action="Details" asp-route-id="@item.Id">
@item.Title
</a>
</li>
}
</ul>
自動エスケープやパーシャルテンプレート等、テンプレートエンジンにほしいものは大体入っています。
ビューテンプレートの内部ではC#のコードを書けます。
変数の定義のほか、DB問い合わせやファイル読み込みが可能です。
ビューにドメインロジックが入り込まないよう注意が必要です。
ルーティング
デフォルトでは、 /コントローラー名/アクション名
というルーティングになります。
ルーティングを独自定義する方法はいくつかありますが、個人的には属性を使用する方法が気に入りました。
[Route("api/people")]
public class PeopleController : Controller
{
// (中略)
[HttpGet]
public async Task<IEnumerable<Person>> Get()
{
return await _context.Person.ToListAsync();
}
}
↑のように、コントローラーのクラスやメソッドに対して属性を設定することでルーティングを行います。
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という組み合わせでなくてもやっていけそうな感じがします。