で、話した資料になります。
先日、ASP.NET MVC 5実践プログラミングをいただいたので(かなり時間はかかりましたが)読んでみました。
会社で開発しているものはASP.NET MVC5 アプリでコードも見ていますが、実際自分の手を動かすことはあまりなく*1、なんとなくしかMVC5での開発をやったことがないので、一度整理する意味もこめて読みました。
全体的には非常にわかりやすい構成になっているのと、実際の開発にすぐ使えるような内容が書かれているなと感じました。
導入・基本・応用の大きく3つに分かれていて、まず導入編で開発環境を作ってMVC 5でアプリを作ります。MVC5での開発の全体像をまず把握することができます。 その後、基本編でビュー・モデル・コントローラーの開発の詳細が説明されています。 最後の応用編では、ルーティングであったり、クライアントサイド開発(バンドル&ミニフィケーション・jQuery・AJAXなど)、認証、Azureの利用といったあたりに触れられています。
一般的に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のコア機能だけでは開発が追い付かないことがあります。この本に載っているところで言えば、
といったところです。これらについても説明されているため、このようなライブラリ・サービスがあってこういうことに使える、といったことを理解することができます。
全体を網羅的に説明しつつ、詳細な機能への入口となる説明を載せている、といったのがこの本を通しての感想です。ですので、
といった方には向いていると思います。個人的には一度全体を通して読んで、自分の知識を整理し、あとは実際の開発をしながら分からないところを読みなおす、という使い方をしています。
逆に、ASP.NET を使いこんでいてコアな部分の辞書的に使いたい、という目的だと説明が長すぎると感じるかもしれません。
Windows上で長期間に渡ってバックグランドで動くようなプログラムを作るのに、Windowsサービスを使うことができます。
なんですが、WindowsサービスをVisual Studioにデフォルトで用意されているものだけで作ると割と面倒だったりします。これを解決するのに、TopShelfというツール(ライブラリ)があります。詳しくは以下のサイトに使い方から詳しく紹介されています。
ここにもある通り、なにが便利かというと、普通のコンソールアプリケーションとして開発することができて、デバッグなどが用意になります。そして、面倒なWindowsサービスとしての設定の部分は、TopShelfのライブラリを参照してC# コードとして記述できることです。
こうやって作成したコンソールアプリケーションのビルド成果物(通常 bin\Release フォルダ以下に作られる exe一式)を動かすとコンソール上、そしてWindowsサービスへのインストールが簡単に実現できます。
さて、これで成果物一式はできたのですが、この成果物を特定のサーバーで動かしたくて、かつCI環境を使って、リポジトリにコミットしたら自動もしくはワンポチでそのサーバーに展開したい、という要件が出てきたとしましょう。
まず、成果物一式を特定のサーバーに転送するには、MSDeployコマンドを使うことができます。MSDeployコマンドが RoboCopy と比べて優れている点は、転送先のフォルダをUNCの共有フォルダでなくても転送できる点です。逆にデメリットとしては、ファイルを受け取る側で2つの必要なサービスをインストールして動いていないといけないことと、特定のポートが開いていないといけない点があります。以前書いたエントリでも紹介しています。
あるディレクトリ以下のファイルを MSDeploy でIIS Webサイトにデプロイする - 銀の光と碧い空
このエントリではIISのWebサイトとして~とありますが、IISとは全く関係ない、普通のディレクトリにも転送(同期)することができます。
これで自動でexeを更新できる...といいたいところですが、Windowsサービスとして動いているのでこのままではうまくいきません。サービスとして動いているプロセスがexeファイルなどをつかんでいるため、そのままでは上書きできないのです。サービスを一時停止していい場合では、この問題に対しMSDeploy の 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」 - 銀の光と碧い空