銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

ASP.NET MVC 5実践プログラミングを読みました

先日、ASP.NET MVC 5実践プログラミングをいただいたので(かなり時間はかかりましたが)読んでみました。

ASP.NET MVC 5実践プログラミング

ASP.NET MVC 5実践プログラミング

読もうと思ったきっかけ

会社で開発しているものはASP.NET MVC5 アプリでコードも見ていますが、実際自分の手を動かすことはあまりなく*1、なんとなくしかMVC5での開発をやったことがないので、一度整理する意味もこめて読みました。

全体的には非常にわかりやすい構成になっているのと、実際の開発にすぐ使えるような内容が書かれているなと感じました。

全体的な構成

導入・基本・応用の大きく3つに分かれていて、まず導入編で開発環境を作ってMVC 5でアプリを作ります。MVC5での開発の全体像をまず把握することができます。 その後、基本編でビュー・モデル・コントローラーの開発の詳細が説明されています。 最後の応用編では、ルーティングであったり、クライアントサイド開発(バンドル&ミニフィケーション・jQuery・AJAXなど)、認証、Azureの利用といったあたりに触れられています。

MVC の説明とEntity Framework

一般的にMVCとは、となると大上段に構えた説明になりがちですが、この本ではASP.NET MVCの本質はView-Controllerであると言ってもよい、ASP.NET MVC にモデルに相当する機能は含まれていない、書いてあります。これは、モデルが単なるデータクラスにとどまるものではないということを意味しています。このあたりまで踏み込んで説明しているのはわかりやすいと思います。

となるとモデルには、ビジネスロジックやデータアクセスを記述することになりますが、ビジネスロジックはアプリケーションによって異なるため、データアクセスについて説明しています。特にMicrosoft Recommendedなライブラリ「Entity Framework」についてもページを割いて説明しているので、はじめてデータベースを使ったWebアプリを MVC5 で開発する場合でも参考にできるのではないかと思います。*2

具体的な操作手順

C# による開発のメリットは、VisualStudioというIDEがもたらしている部分が大きいです。これは ASP.NET MVC の開発でも同じだと思っています。この本では開発手順として VisualStudio の操作手順も丁寧に説明してあります。 また、具体例を挙げると、 「Viewを作成するときには、先にControllerに

return View();

とあったら、この"View"の部分からVSを操作してViewを作成できます」 というように、実際の開発でもこういう手順で動かすだろうな、という手順が載せてあるのも非常にわかりやすかったです。

網羅的な説明とその先への指針

たとえば、Viewの開発ではビューヘルパーを使うことがありますが、あらかじめ用意されているヘルパーメソッドについての説明も書かれています。また、さらにその先として、独自ビューヘルパーの定義の仕方も説明されています。このあたり、なんとなく知っていて使っているという状態であると、いったん自分の知識を整理することができ、その先に進む方針もわかりやすいのではと思います。

周辺技術への入口となる応用編

最近のWeb技術は多様化していることもあり、MVC5のコア機能だけでは開発が追い付かないことがあります。この本に載っているところで言えば、

  • JavaScript/CSS のロード時間を削減するためのバンドル・ミニフィケーション
  • クライアントサイドの開発で利用するjQuery
  • 認証機能を実装するときに利用する ASP.NET Identity
  • Azure Web Sitesを利用した迅速なアプリの展開

といったところです。これらについても説明されているため、このようなライブラリ・サービスがあってこういうことに使える、といったことを理解することができます。

まとめ

全体を網羅的に説明しつつ、詳細な機能への入口となる説明を載せている、といったのがこの本を通しての感想です。ですので、

  • なんとなく ASP.NET を知っている
  • JavaやRuby on Rails といった他言語・フレームワークでWeb開発をしたことがあって、C# の基本的機能は知っている

といった方には向いていると思います。個人的には一度全体を通して読んで、自分の知識を整理し、あとは実際の開発をしながら分からないところを読みなおす、という使い方をしています。

逆に、ASP.NET を使いこんでいてコアな部分の辞書的に使いたい、という目的だと説明が長すぎると感じるかもしれません。

*1:MVCのバージョンあげたり、MVCとあまり関係ない部分を触ったりはありますが

*2:ただ、個人的には EntityFramework (のような重厚なORマッパー) は嫌いなので使わないのですが...

TopShelf と MSDeploy で作る、Windowsサービスお手軽自動展開環境

Windows上で長期間に渡ってバックグランドで動くようなプログラムを作るのに、Windowsサービスを使うことができます。

Windows サービス アプリケーションの概要

なんですが、WindowsサービスをVisual Studioにデフォルトで用意されているものだけで作ると割と面倒だったりします。これを解決するのに、TopShelfというツール(ライブラリ)があります。詳しくは以下のサイトに使い方から詳しく紹介されています。

Windowsサービスを楽に開発~TopShelf~ | 84zume Works

ここにもある通り、なにが便利かというと、普通のコンソールアプリケーションとして開発することができて、デバッグなどが用意になります。そして、面倒なWindowsサービスとしての設定の部分は、TopShelfのライブラリを参照してC# コードとして記述できることです。

こうやって作成したコンソールアプリケーションのビルド成果物(通常 bin\Release フォルダ以下に作られる exe一式)を動かすとコンソール上、そしてWindowsサービスへのインストールが簡単に実現できます。

さて、これで成果物一式はできたのですが、この成果物を特定のサーバーで動かしたくて、かつCI環境を使って、リポジトリにコミットしたら自動もしくはワンポチでそのサーバーに展開したい、という要件が出てきたとしましょう。

まず、成果物一式を特定のサーバーに転送するには、MSDeployコマンドを使うことができます。MSDeployコマンドが RoboCopy と比べて優れている点は、転送先のフォルダをUNCの共有フォルダでなくても転送できる点です。逆にデメリットとしては、ファイルを受け取る側で2つの必要なサービスをインストールして動いていないといけないことと、特定のポートが開いていないといけない点があります。以前書いたエントリでも紹介しています。

あるディレクトリ以下のファイルを MSDeploy でIIS Webサイトにデプロイする - 銀の光と碧い空

このエントリではIISのWebサイトとして~とありますが、IISとは全く関係ない、普通のディレクトリにも転送(同期)することができます。

これで自動でexeを更新できる...といいたいところですが、Windowsサービスとして動いているのでこのままではうまくいきません。サービスとして動いているプロセスがexeファイルなどをつかんでいるため、そのままでは上書きできないのです。サービスを一時停止していい場合では、この問題に対しMSDeploy の runCommand プロバイダーを使うことで解決することができます。

Web 配置 runCommand プロバイダー

操作設定 -presync および -postSync と共に runCommand を使うことによって、MSDeployによるファイル同期の前後に指定したコマンドを実行できます。この場合、サービスの停止と開始を指定してあげるとうまくいきます。

MSDeploy.exe -preSync:runCommand="net stop MyService" -verb:sync -source:dirPath="C:\Tool\bin" -dest:computerName="http://ww.xx.yy.zz/MSDeployAgentService",userName="administrator",password="password",includeAcls="False",dirPath="C:\Tools\bin"  -postSync:Command="net start MyServoce"

更新対象のexeを MyServiceというサービスで動かしている場合、このコマンドでMyServiceを止めてから同期が実行され、MyServiceを起動することになります。

という感じでこの2つを組み合わせると、割と簡単にWindowsサービスの自動展開環境を作ることができます。

そして、前回のエントリで紹介した Config Transform を使うと、展開先が複数あって設定を切り替えたい場合も、コードは1つで App.XXX.config を展開先ごとに用意することで対応することができます。

App.config の config変換をしてくれる便利すぎるVisual Studio 拡張「Configuration Transform」 - 銀の光と碧い空