複数のプロジェクトに分けて.Net MVCのアプリを作りたい場合にとりあえずできたこと。
ある程度、大きくなる想定のWebアプリを作る場合に、単一のプロジェクトで構成するとえらいこっちゃになる。 とにかく、プロジェクト分けたいのです。一発プロジェクトは漢らしくていいんだけど、複数チームで作業する場合は機能とかもろもろ考慮で分業しておきたいの。。。
複数のプロジェクトで一個のWebアプリにしたい場合にどうやるかを試したメモ。 わりと当たり前のように必要な事だと思うのですが、調べても調べてもドンピシャの情報に いきあたらないのはなんでなんでしょ。この程度は当たり前の事なのかな・・・。
とりあえず、サンプルとして以下の感じにする。調べてみると、一つのソリューションの中に複数のプロジェクトがある感じのものは見るけど、ソリューションごと別の奴は見たことないのでソリューションも分ける。
MainWeb : 大本のプロジェクト SubWeb : 分割しておくプロジェクト
まず、MainWebのプロジェクトを作る。とにかく簡素な感じにしたいので、空MVCで作る。↓の感じ
そしたら、コントローラーとViewを適当に追加しておく。 出来たら、「Areas」っていうフォルダをプロジェクト直下に追加しておく。とりあえず↓の感じ。
SubWebも同じ感じで作る。↓の感じ。
SubWebの直下にAreaRegistrationのクラスを作る。↓の感じ。
ファイルの名前(クラスの名前)は何でもいいっぽいけど、「SubWebAreaRegistration」にしておいた。 中身は以下にして、SubWebをビルドしておく。
using System.Web.Mvc; namespace SubWeb { public class SubWebAreaRegistration : AreaRegistration { public override string AreaName { get { return "SubWeb"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "SubWeb_default", "SubWeb/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } } }
次はMainWeb側の参照にSubWeb.dllへの参照を追加して、ビルドしておく。
そしたら、IISの設定をする。まず、新しくサイトを作るで、MainWebでサイトを作っておく。
出来たら、中のフォルダの「Areas」を右クリして、仮想ディレクトリの追加でSubWebを追加する。
これで、とりあえず動くようになる。サイトのアクセスは下の感じ。
これで、プロジェクトを分割したMVCの作りが出来そう。まだいろいろ試せてないけど、 基本はこれでいいのだろうか・・・。いまいち分かってない。
ついでに、今回は仮想ディレクトリで持ってきたけど、MainWebのViewsの中にcshtmlだけコピーしても普通に動く。仮想ディレクトリを追加する前に、SubWebにアクセスしようとすると、cshtmlとかの探してる順番がエラーログに出るので参考に見てみてもいいかも。。。
結局のところは、ルーティングの設定をどうするかっていう事なんだろうか。 単一プロジェクトだと、「Global.asax」の「RouteConfig.RegisterRoutes(RouteTable.Routes);」ってところで、「RegisterRoutes」呼び出してやってるけど、Areaを使う感じにすると、「Global.asax」の「AreaRegistration.RegisterAllAreas();」って呼び出しのところでAreaRegistrationを全部やるみたいな動きになる模様。
で、「RegisterAllAreas()」の中で、参照に登録さているアセンブリの中から「AreaRegistration」を継承して作ってあるクラス(今回の例だと「SubWebAreaRegistration」)を全部探し出して勝手にやってくれるみたい。
次は認証とDB回りをこの構成で試す。あと、ルートの書き方は多分足りてない。要調整。