Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】速習 ASP.NET Core 3 速習シリーズ【C#】

C#によるWebアプリ開発の本

 C#を仕事で最後に使ってからもう何年も経つので、最近の動向を見るために購入。
技術書では安心の山田祥寛さんの本、電子書籍のみですが手軽に読める速習シリーズです。

 旧.NET Framework、現.NET CoreであるMicrosoft社のアプリケーション実行環境。
その中のWebアプリのフレームワーク部分が大昔はよく使われており、割と評判が悪かったASP.NET Web Forms、その後進化して一時期総称がASP.NET MVCと呼ばれていたような気がしますが、今は「ASP.NET Core」がWebアプリケーションフレームワーク関係の技術の総称。2019年にバージョン3。
そのASP.NET Core 内に、サブフレームワークコンポーネント的な位置づけで幾つか技術が内包。APIを作るASP.NET Web API、DBアクセス技術のEntitry Framework、より画面中心のシンプル開発のRazor Pages、Web Assenblyと関係した新技術のBlazor……などなど。その中で中核、MVCアーキテクチャで手軽に開発できる一般的なWebアプリケーションフレームワークとしての仕組みが 「ASP.NET MVC」という位置づけでした。
本書はこの最新のASP.NET Core3に対応した数少ない本となります。

f:id:iwasiman:20200821215147p:plain
Cが円になってるロゴはコミュニティによる非公式ロゴだそうです

ASP.NET Core 3/ASP.NET MVCでの開発の概要

  • Controller層がC#のクラスで、アクションメソッドでパラメーターやらPOSTの中身を受け取って処理。メンバ変数に持ったContextクラス経由でModel層にアクセスできる。
  • Model層がDBアクセスの仕組みを抽象化したORマッパーのEntity Frameworkを使った部分で、C#の1クラス=1テーブル、1メンバ変数=テーブルの1カラム で自動アクセス可能。SQLは基本書かない模様?
  • View層が.cshtmlファイルで技術の名前としてはRazorテンプレート、プログラム側の値をセットしたりC#の構文が呼べたり。
  • ビューヘルパー/タグヘルパーとして画面内の要素を自動生成など便利機能あれこれ。HTML的には"asp-*"で始まるカスタムデータ属性を利用。
  • DB接続情報などは今風にJSONの設定ファイル。
  • でもContextクラスの登録はMain的なクラスで、設定ファイルは少なくなっている。
  • 固定のCRUD画面が短い手間で作れるスキャフォールディング機能がある。

 ……などなど、完全にRuby on RailsRailsの影響を受けたPHPフレームワーク群の思想やスタイルに寄せてきてるなあという感触。
 昔のASP.NET Web Formsは、Visual Studio上で部品を配置しながらポチポチやってWindowsアプリを作る際の感触をそのままWebに持ってこようとして、かつWeb固有のことはできる限り開発者から隠蔽してVisual Studioと旧MS帝国の言うとおりにしてればいいですよ~という、現在からするとちょっとアレな発想を持っていたことからすると、だいぶ変わったなあと思います。

 独自のところというと、リクエストがあったら単純にDBにアクセスするのでなくタイミングを遅らせて非同期で処理したりできるようになっているのは何気に凄いですね。画面からの更新の競合やデータが見つからなかった際の処理もだいぶ抽象化されていました。

 ほか、DBアクセスのSQL文ライクな処理をC#のコードとして書けるLINQという技術が.NETにはあるのですが、本書の最初の方ではまだ出てきませんでした。スキャフォールディング機能で間に合うレベルの開発だと使わないのかな。
 そして後半の詳細に行きますと……

  • 画面のレイアウトは.cshtmlファイルに外出しして、ヘッダーやフッターの共通化入れ子もできる。
  • HTMLの一部分を.cshtmlに定義して親画面にはめ込む「部分ビュー」の機能。
  • .cshtmlの見た目+C#のクラスでのロジックでDBの検索結果を埋め込んだりできる「ビューコンポーネント」の機能。この機能はフロントエンドのReactやVue.jsの「コンポーネント」の概念に近くて面白いと思いました。
  • バリデーションはModelクラスのメンバ変数の上にアノテーションでチェックの種類とメッセージを定義。画面の.cshtmlファイルにはdivspanタグのカスタムデータ属性に、ここに表示しますよと定義。カスタムのルールも定義可能。
    →自分はバリデーションは処理の入り口のController層でやることが多いので、軽量な開発ではこれで済むのでしょうがModel層でやるのはどうも馴染めないなあと。

  • URLルーティングのオプションもStartup.csファイルにいろいろ定義可能。

  • 排他制御はModelクラスのメンバにRowVersionという項目を持たせると、内部で判定してくれる。日付型の項目で比較している模様。
  • JavaScriptCSSなどのサポートでは、Webpackみたいなバンドル操作をしてくれるBuildBundleMinifierというライブラリがNuGetから入手可能。
  • ライブラリ管理はnpm/yarnの代わりにLibManというライブラリが用意されている。開発と本番でファイルを分けたり。
  • セキュリティではクロスサイトスクリプティング(XSS)対策で、文字列は自動的にHTMLエスケープ。これは大抵のフレームワークとも同じ。
  • クロスサイトリクエストフォージェリー(CSRF)対策で、リクエストごとにトークンを発行してサーバーサイドでチェックする機能あり。これもRailsやLaravelにある機能ですね。

  • 驚きだったのですがVisual Studioなしでも、今はコマンドラインからdotnetコマンドでプロジェクトを作ったりいろいろ操作可能。このへんもフロントエンドの各種ライブラリに近くて面白い。

  • O/Rマッパー技術で内部に持っているEntity Framework周りも、dotnetコマンドでDBやテーブルを作ったり各種マイグレーションができる。このへんはLaravelフレームワークのartisanのmake:migration~などのコマンドを思わせます。

 というように、フロントエンドの技術全般や今も使われて進化を続けている他の言語のフレームワークにだいぶ寄せた、モダンな感じに進歩しているなあと思いました。
それほど破壊的な変更はなく、他の言語やフレームワークに慣れた人なら既存知識の延長で弄っていけそうです。(まあDBアクセスのLINQはかなり独特ですが……)

 C#周りといえばゲーム開発のUnityは不動、Azureもクラウドプラットフォーム2位ぐらいと存在感ありますが、Webアプリケーション開発についてはこの.NET CoreやASP.NET MVC周りはあまり採用実績や勉強会の資料/ブログ/Qiitaなどネット上の情報全般を見かけない気がします。
情報をオープンにするような文化がない、お堅めの界隈で使われることが多いのかもしれませんが、実際のところのシェアはどうなのかなと思いました。

ASP.NET Core/ASP.NET MVC関連の本

『プログラミングASP.NET Core (マイクロソフト関連書) 』が出ましたMS公式謹製の本。原書が2018年、日本語が2019年。ASP.NET Core全般を扱っています。

C#フレームワーク ASP.NET Core 3入門』が様々な言語やフレームワークの入門書を出しているしょうだつやのさんの本で2019年刊行。この方の本は当たり外れけっこうありますね…

ASP.NET MVC 5 実践プログラミング』は本書と同じく山田祥寛さんの本ですが2014-15年刊行、ASP.NET4.6 + ASP.NET MVC5時代なので今はもう役に立たないですね。そういえばこの本僕も読もうと思ってそのままになってた…

MS公式からも『プログラミングASP.NET MVC 第3版 ASP.NET MVC 5対応版』という本が2014-15年に出ていますがこちらも今は不要です。

やっぱり本も少ないですね。公式のリファレンスやチュートリアルでやりましょうということなのでしょうか。そういう意味では本書は短いながらかなり貴重な本ではないかと思います。

こちらの記事もどうぞ

iwasiman.hatenablog.com

iwasiman.hatenablog.com

iwasiman.hatenablog.com

iwasiman.hatenablog.com