2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】ASP.NET Coreで複数プロジェクト構成のススメ

Posted at

こんにちは!!

8月も下旬なのに、全然気温下がりませんな...ι(´Д`υ)
最近ちょっとご飯🍚を食べすぎてる🍞焼きたてパン(@kitchen-craft)です。

🧭 目次

🎯 この記事の対象

今回は...
『複数プロジェクト構成のススメ』
ということで、

  • 複数プロジェクトってそもそもどういうこと❓
  • 普通にファイルを分けるのとどう違うん📁
  • 夜中にそうめん🍜とか食べちゃうんや...

などの説明を行いながら、実際に複数プロジェクト構成を作成していきたいと思います👀

特に!!

参考書📕や技術ブログ🌐を見ても、全然実装方法書いてないし、メリットデメリットの説明とかも本当に乗っていないのにも関わらず、中規模~大規模案件では当たり前のように複数プロジェクト運用となっているので、初心者や未経験の方はぜひ読んでいってください(。-人-。)

✅ STEP 1:そもそも『複数プロジェクト構成』ってなんぞ❓

ざっくり言うと、1つのアプリやシステムを、機能ごとに分けて複数のプロジェクトとして管理する方法です👀

🍀プロジェクトが1つの場合👇
image.png

🍀複数プロジェクトの場合👇
image.png

この構成は、機能の独立性を高めたり、保守性・再利用性を向上させるために使われます。特に中〜大規模な開発やチームでの分業において効果を発揮します。

💡 メリットについて

上記の図のように複数プロジェクト化することによって、以下のメリットがあります👀

1. 責務の明確化👀

各プロジェクトが 「何をするべきか」が明確になる ことで、コードの可読性と保守性が向上します。 たとえば、UI層がビジネスロジックを直接扱うことがなくなり、設計が整理されます。


2. 変更に強くなる🔧

ある機能を修正しても、他のプロジェクトに影響を与えにくくなります。
たとえば、DBの接続方法を変更しても、UIやロジック層には影響しないようにできます。


3. テスト容易性の向上📄

ロジック層がUIや外部依存から分離されているため、ユニットテストがしやすくなります。(最小単位のテスト) モックやスタブ(テスト用のオブジェクト)を使ったテスト設計も可能になります。


4. 再利用性の向上♻👪

5. チーム開発に適している👪

役割ごとに分担しやすく、 複数人での並行開発が効率的になります。
責務が分かれていることで、コードレビューや設計議論もスムーズになります。

⚠️ デメリットについて

もちろん、以下のようなデメリットもあります(´;ω;`)

1. 学習コストが高い📓

初心者にとっては、プロジェクト間の依存関係や責務の分離を理解するのが難しいことがあります。 特にDI(依存性注入)やインターフェース設計などの概念が必要になります。

2. 構成が複雑になる📁

プロジェクト数が増えることで、ビルド設定や参照関係の管理が煩雑になります。 IDEの設定やCI/CDパイプライン(ビルドやデプロイの自動化)の構築にも注意が必要です。

3. 小規模開発には過剰な場合も😭

機能が少ないアプリケーションでは、分割することで逆に開発効率が落ちることがあります。 「分けること」が目的にならないよう、適切な粒度で設計する必要があります。

上記の理由から、参考書📕などでは取り扱うことが少ないため、初学者や未経験ではあまり触れられないのだと思います。


複数プロジェクト構成は、中〜大規模開発やチーム開発において非常に有効な設計手法です。 ただし、導入には設計力と理解が必要なので、まずは 「なぜ分けるのか」「どこまで分けるべきか」 を意識することが重要です。

✅ STEP 2:プロジェクトの分け方の種類について見てみよう!

では実際に 「どのように分けていくかのがいいのか」 について
代表的なものかた見ていこう😃!
なお、ここに記載するのは「代表的な例」であり、実際はプロジェクトに合わせた分け方にするのがベスト👍だと思います👀

🧱 ドメイン駆動型(DDDベース)

MyApp/
├── MyApp.Domain          // ドメイン層:エンティティ、値オブジェクト、ドメインサービスなど
├── MyApp.Application     // アプリケーション層:ユースケース、DTO、アプリケーションサービス
├── MyApp.Infrastructure  // インフラ層:DBアクセス、外部API連携、リポジトリの実装
├── MyApp.API             // プレゼンテーション層:Web APIのエンドポイント(Controllerなど)
└── MyApp.Tests           // テストプロジェクト:各層の単体テストや統合テスト

📌 特徴:責務ごとに明確に分離されており、変更に強く、テストしやすい構成。


🧩 機能単位型(業務ごと)

CorpSystem/
├── Corp.LoginService         // ログイン機能に関するサービス一式
│   ├── Login.API             // ログインAPIのエンドポイント
│   ├── Login.Application     // ログインユースケースやサービス
│   ├── Login.Domain          // ログインに関するドメインモデル
│   ├── Login.Infrastructure  // DBや外部認証との連携
│   └── Login.Tests           // ログイン機能のテスト
├── Corp.AttendanceService    // 勤怠管理機能
├── Corp.PayrollService       // 給与計算機能
├── Corp.SharedLib            // 共通ライブラリ(ユーティリティ、共通DTOなど)
└── Corp.Web                  // フロントエンドやWeb UI

📌 特徴:業務ごとに独立しているため、チーム分割やマイクロサービス化がしやすい。また、既存システムの改修案件など、昔の構成はこのような感じなのが多いイメージ👀


🧭 レイヤー型(三層アーキテクチャ)

MyApp/
├── Presentation  // UIやAPIコントローラーなど、ユーザーとの接点
├── Business      // ビジネスロジック、サービス、ユースケース
├── DataAccess    // DBアクセス、リポジトリ、ORMなど

📌 特徴:むちゃシンプルで理解しやすく、小〜中規模のプロジェクトに向いている。


🧱 クリーンアーキテクチャ型

MyApp/
├── Core           // エンティティ、ユースケースなどの純粋なビジネスルール
├── Interface      // UI、API、外部インターフェース(Controllerなど)
├── Infrastructure // DB、外部サービス、フレームワーク依存の実装

📌 特徴:依存関係が内側に向かう構造で、技術に依存しない設計が可能。


🧪 サービス指向型(SOA / マイクロサービス)

CompanySystem/
├── user-service/       // ユーザー管理機能(独立したサービス)
├── order-service/      // 注文管理機能
├── payment-service/    // 決済機能
└── gateway/            // APIゲートウェイ(各サービスを統合)

📌 特徴:各サービスが独立しており、スケーラブルで障害に強い構成。


このように、プロジェクトの分け方によって、それぞれ特徴があるので、自分の学習しているプロジェクトや今後どのように展開していくかによって、いろいろ検討してみてください👀

✅ STEP 3:複数プロジェクト構成に設定してみよう!

さて!『複数プロジェクト』について、なんとなく理解ができたと思いますので、今度は実際に複数プロジェクトを設定していきましょう👀!

今回は上記での説明でもあった

------『機能単位型(業務ごと)』------

を参考に作成していきます!

また、以下の環境で説明していきます。


環境

  • Visual Studio 2022
  • ASP.NET Core MVC
  • .NET 8.0

『開発環境によって設定の仕方は様々なので注意!』
今後、SpringBootなどでの複数プロジェクト化についても記事を別で投稿予定ですが、『Gradle』とか使った今回の内容とはかなり違った方法なので、あくまでも「ASP.NET」での設定方法となることご了承くださいm(__)m


✅ STEP 3-1:メインとなるプロジェクトを作成しよう!

まずは改めて、機能単位型のフォルダ📁構成を見てみましょう👀

CorpSystem/
├── Corp.LoginService         // ログイン機能に関するサービス一式
├── Corp.AttendanceService    // 勤怠管理機能
├── Corp.PayrollService       // 給与計算機能
├── Corp.SharedLib            // 共通ライブラリ(ユーティリティ、共通DTOなど)
└── Corp.Web                  // フロントエンドやWeb UI

今回では 『表示する画面がメインとなるプロジェクト』 として、
『Webプロジェクト』 を作成してきましょう!
ここはどんどん進んでいきます。

image.png

image.png

image.png

image.png

1つ目のプロジェクト完成🌟

image.png

作成したファイルが分かりやすいように、各ソースの内容を簡単に修正していきます👀

Views/Home/index.cshtml

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">メインとなるページ!!!</h1>
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

これで起動時の画面が分かりやすくなりました。

image.png


✅ STEP 3-2:ほかのプロジェクトを作成しよう!

こんな感じで、以下のプロジェクトを追加していきましょう!

  • 共通ライブラリ(共通にしたい処理をまとめるとこ)
  • ログイン機能
  • 勤怠管理機能
  • 給与計算機能

ここで⚠️注意したいのが、『共通ライブラリ』は画面の機能を持たないので、『クラスライブラリ』として作成することです。

早速見ていきましょう👀

❶ 上部の「ファイル」から「新規作成(N)」⇒「プロジェクト(P)...」を選択する

image.png

❷ 「クラス」で検索し、.NETを対象とする「クラス ライブラリ」を選択する

image.png

❸ 「プロジェクト名」を入力し、「ソリューションに追加」に変更する

!!!!!!ここが重要なところ!!!!!!
上記の図でも説明した通り...

image.png

たとえプロジェクトが分かれていたとしても、ソリューションは同じであることが重要です。

image.png

image.png

image.png

さあ!これで『共通ライブラリ』プロジェクトを追加することができました。
このように、「MVC」でプロジェクトを作成するのではなく、「クラスライブラリ」として追加することで、明確に役割を持たせることができます👪


残りの

  • ログイン機能
  • 勤怠管理機能
  • 給与計算機能
    のプロジェクトも作成してまいりましょう👀

image.png

残りのプロジェクトは全て画面も持たせる機能となるため、「MVC」プロジェクトとして作成してまいります。

image.png




作成後👇👇

image.png

さあ!これで完成!!....というわけではございません(´;ω;`)
先ほどの図をもう一度👀見ていただきたい...。

image.png

この通り、参照設定を行う必要があります。
今回の場合、メインプロジェクトとなる『webプロジェクト』からほかの画面へ遷移するように、以下の手順で参照設定を行っていきます👇👇

✅ STEP 3-3:プロジェクト参照をしよう!!

❶ 設定したいプロジェクトを選択し、上部の『プロジェクト(P)』⇒『プロジェクト参照の追加(R)』を選択する

image.png

❷ 参照したいプロジェクトにチェックを入れて『OK』を選択する

image.png

参照設定は以上でございます。
こうすることで、プロジェクトを分けたとしても、そのプロジェクトのクラスやメソッドにアクセスできるようになります👇👇

設定前
image.png

設定後
image.png

✅ STEP 3-4:サブプロジェクトをクラスライブラリに変更しよう!!

他にも設定する項目がございます😢
メインプロジェクト以外のプロジェクトをすべて『クラスライブラリ』に変更する必要があります👇👇

❶ 対象のプロジェクトを選択し、『プロジェクト(P)』⇒『〇〇のプロパティ(P)』を選択する

image.png

❷ 『出力の種類』を「クラスライブラリ」に変更する

image.png

『共通ライブラリ(SharedLib) 』以外を同様にクラスライブラリに変更していきましょう👀

✅ STEP 3-5:サブプロジェクトの『Program.cs』を削除しよう!!

メインプロジェクト以外の『Program.cs』があると、起動時に競合し、エラーが発生してしまうため、削除します。

image.png

✅ STEP 3-6:各コントローラーの名前を変更しよう!!

メインプロジェクトの中にある 『HomeController.cs』 が他のプロジェクト内にも存在していると、アクセスしてくる場所が分からず、エラーとなってしまいます。

重複しないようにクラス名と、htmlが格納されているフォルダ名📁を変更しましょう🥺

例👇

image.png

他のプロジェクトの中身も同様に変更していきます。
ついでに、画面の見分けもつくように、htmlの内容も変更していきましょう📄

image.png

image.png

image.png

✅ STEP 3-7:プロジェクトをリビルドしよう!!

  • ビルド(Build) 変更があったファイルだけをコンパイルして、既存の成果物(DLLやEXE)を再利用します。
    → 速いけど、古い成果物が残っていて不整合が起きる可能性がある。

  • リビルド(Rebuild) まず「クリーン(Clean)」で既存の成果物を全部削除し、その後に全ソースコードを最初からコンパイルします。
    → 遅いけど、ビルドキャッシュや古いファイルの影響を完全に排除できる。

依存関係やプロジェクトの設定を変更したあとは、リビルドが役に立ちます🔧

image.png

✅ STEP 3-8:スタートアッププロジェクトを設定しよう!!

初めに作成したプロジェクトが自動的にスタートアッププロジェクトに設定されたりしますが、改めて再設定しとくとよいでしょう👀🌟

image.png


お疲れ様でございました...(_´Д`)ノ

結構な変更を加えてきましたが、以上で複数プロジェクト構成の基本的な設定は終了でございます!!

それではさっそく実行してまいりましょう°˖☆◝(⁰▿⁰)◜☆˖°


メインページ(localhost:7122/)
image.png

ログインページ(localhost:7122/Login)
image.png

勤怠管理機能ページ(localhost:7122/Attendance)
image.png

給与計算ページ(localhost:7122/Payroll)
image.png

 

しっかりと画面が動作しておりますね👀🌟

今回は説明のために簡単に作成したため、複数プロジェクト構成の重要さというのは、あまり実感が持てなかったかもしれませんが、今後、このシステムがめちゃくちゃ大きくなっていったときに大いに役に立ってくれますので、自己学習をする際でも意識していきましょう📕


今回の記事はここまででございます👀
最後まで読んでくださりありがとうございましたm(__)m!

また、別の記事にて初学者向けにASP.NET Core MVCの記事も投稿しておりますので、そちらもどうぞ見ていただけたら嬉しいです(^O^)

それでは、よいプログラミングライフを!👋

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?