くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

プロジェクト分割

.net MVC プロジェクト分割

以前、複数のプロジェクトで一つのサイトを構成するエントリを書いた。それの続き。

色々試してみてるけど、とりあえず今のとこ理解した事のメモ。

  • 単純にプロジェクト(ソリューション)分割しても、dllは分かれるけど、アプリケーションプールが分けられない。
  • 上記の場合はSessionの共有ができる。(以前書いたエントリのやり方だと)

個人的にアプリケーションプールも分けたい。ちょろちょろ調べると、アプリケーションプール分けると普通のやり方ではSessionの共有が出来ないっぽい。

基盤的なものを作らないとだめそーですね。ということで、とりあえず、アプリケーションプールも分けられる構成方法は以下。

とりあえず、ベースとなるMVCアプリを作る。(認証系は全部ここに入れるか、別アプリで認証サーバ的な何かを作っておかないとダメ)

で、サブ的なMVCアプリを作る。サブのほうの参照にベースのDLLを入れてコンパイル。

そしたら、Global.asax.csを削除する。して、Global.asaxの編集。以下の感じ。

<%@ Application Codebehind="Global.asax.cs" Inherits="**ここをベースと同じにする**" Language="C#" %>

ここまででベース側の起動処理とかが組み込まれる。逆にサブ側の起動処理的なものはガン無視されるので、不要なファイルは全部消す。

これで全てのサブアプリで共通の基盤的な動きになる。

で、大きな問題が一つ。ルートの定義が出来ない。出来ないというか、Area的なやり方ではないので、.netに組み込まれてる「Html.ActionLink」でサブアプリ側へ行く記述が出来ない。ここはヘルパー自作するしかないかしらね。。。

あと、bundle系。こーゆーのやるなら、もちろんCSSとかスクリプトとかも一か所で管理したいじゃない。。。

困ったことにbundleって”~/hoge/fuga”的な書き方じゃないと許してくれなかった。レイアウトに直書きしかないのかしら。。。ヘルパー作るか?

あと、この構成だと、セッションの共有が出来ないからもちろん認証の共有もデフォじゃ無理。なので、何か仕組みを作っておかないと無理かな。セッションの共有はSQLServerで行けそうだけど微妙かな。。。

さらにためし中。

.Net MVC4のWebアプリをプロジェクトを分割して構成する

複数のプロジェクトに分けて.Net MVCのアプリを作りたい場合にとりあえずできたこと。

ある程度、大きくなる想定のWebアプリを作る場合に、単一のプロジェクトで構成するとえらいこっちゃになる。 とにかく、プロジェクト分けたいのです。一発プロジェクトは漢らしくていいんだけど、複数チームで作業する場合は機能とかもろもろ考慮で分業しておきたいの。。。

複数のプロジェクトで一個のWebアプリにしたい場合にどうやるかを試したメモ。 わりと当たり前のように必要な事だと思うのですが、調べても調べてもドンピシャの情報に いきあたらないのはなんでなんでしょ。この程度は当たり前の事なのかな・・・。

とりあえず、サンプルとして以下の感じにする。調べてみると、一つのソリューションの中に複数のプロジェクトがある感じのものは見るけど、ソリューションごと別の奴は見たことないのでソリューションも分ける。

MainWeb : 大本のプロジェクト
SubWeb : 分割しておくプロジェクト

まず、MainWebのプロジェクトを作る。とにかく簡素な感じにしたいので、空MVCで作る。↓の感じ

01

そしたら、コントローラーとViewを適当に追加しておく。 出来たら、「Areas」っていうフォルダをプロジェクト直下に追加しておく。とりあえず↓の感じ。

02

SubWebも同じ感じで作る。↓の感じ。

03

SubWebの直下にAreaRegistrationのクラスを作る。↓の感じ。

06

ファイルの名前(クラスの名前)は何でもいいっぽいけど、「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への参照を追加して、ビルドしておく。

05

そしたら、IISの設定をする。まず、新しくサイトを作るで、MainWebでサイトを作っておく。

10

出来たら、中のフォルダの「Areas」を右クリして、仮想ディレクトリの追加でSubWebを追加する。

11

12

これで、とりあえず動くようになる。サイトのアクセスは下の感じ。

21

22

これで、プロジェクトを分割したMVCの作りが出来そう。まだいろいろ試せてないけど、 基本はこれでいいのだろうか・・・。いまいち分かってない。

ついでに、今回は仮想ディレクトリで持ってきたけど、MainWebのViewsの中にcshtmlだけコピーしても普通に動く。仮想ディレクトリを追加する前に、SubWebにアクセスしようとすると、cshtmlとかの探してる順番がエラーログに出るので参考に見てみてもいいかも。。。

結局のところは、ルーティングの設定をどうするかっていう事なんだろうか。 単一プロジェクトだと、「Global.asax」の「RouteConfig.RegisterRoutes(RouteTable.Routes);」ってところで、「RegisterRoutes」呼び出してやってるけど、Areaを使う感じにすると、「Global.asax」の「AreaRegistration.RegisterAllAreas();」って呼び出しのところでAreaRegistrationを全部やるみたいな動きになる模様。

で、「RegisterAllAreas()」の中で、参照に登録さているアセンブリの中から「AreaRegistration」を継承して作ってあるクラス(今回の例だと「SubWebAreaRegistration」)を全部探し出して勝手にやってくれるみたい。

次は認証とDB回りをこの構成で試す。あと、ルートの書き方は多分足りてない。要調整。

問合せ