第2章:教材の全体地図&題材システム紹介(ミニEC/フリマ)🗺️🛒
2.1 この教材でできるようになること(ゴール)🎯✨
この教材の最終ゴールは、こんな状態になることです👇💕
- 外部APIの“クセ”が強くても、内側(自分の設計)をキレイに守れる🧼🧱
- 「外の都合(DTO・命名・単位・エラー形式)」を、そのまま内側に持ち込まない🙅♀️
- 仕様変更やレガシー改修が来ても、壊れる場所が“外側だけ”に限定できる🛡️
- 翻訳(変換)テストで、外部変更を早めに検知できる✅
2.2 題材システム:ミニEC/フリマの世界観 🛍️📦💳
登場するのは、超ミニ版の「売買アプリ」だと思ってください😊✨ ざっくり流れはこう👇
- 会員(Member)がいる👤
- 商品を買って注文(Order)する🛒
- 決済(Payment)して支払い完了にする💳✅
この教材では「Web画面」よりも、まず **Web API(サーバー側)**を作っていきます🌐🧑💻 (後からUIを付けたくなったら付けられる構造にしておくのが狙いです✨)
2.3 “内側”と“外側”の登場人物(ここ超大事)🧩🧠

内側(自分たちの世界)🌸
内側は「自分たちがコントロールできる」エリアです😊 ここは 言葉・型・ルールをキレイに保ちたい✨
- 注文:Order 🛒
- 支払い:Payment 💳
- 会員:Member 👤
✅ 内側の理想:
- 命名が自然(OrderId / Money / PaymentStatus など)
- 値が正規化されてる(通貨・単位・時刻がきっちり)
- 不正な状態が入ってこない(null地獄しない🙅♀️)
外側(外部サービスの世界)🌪️
外側は「相手の都合で変わる」エリアです😇 クセが強いこと、普通にあります…
- 決済API(クセあり)💳🌀
- レガシー会員API(古い・歪みあり)🧓📼
例:決済APIが返す“クセ強めJSON”😵💫
snake_case- 金額が cents(最小単位)
- ステータスが増えたり名前が変わったりする
{
"payment_id": "p_123",
"amount_cents": 1299,
"currency": "JPY",
"status": "succeeded",
"created_at_utc": "2026-01-28T01:23:45Z"
}
例:レガシー会員APIの“古い事情”😇
- 変な略語・古い命名
- 日付が文字列で形式バラバラ
- true/false が "0"/"1" の文字列だったりする
{
"mem_no": "00001234",
"mailaddr": "a@example.com",
"rank_cd": "G",
"birth": "1999/07/01",
"is_stop": "0"
}
2.4 ACLはどこに置くの?(まだ作らないけど、地図だけ見る)🧱🌊
ACL(腐敗防止層)は一言でいうと…
外側の“変な形/意味”を、内側の“キレイな形/意味”に翻訳する通訳さん🧑🏫✨ そして、内側を守る防波堤🌊🧱
イメージ図(超重要)👇
内側が外側に直接つながると、こうなりがち👇😇
- ドメインに
HttpClientが出てくる - 外部DTOがそのまま内側を走り回る
- 外部の命名が内側のクラス名に感染する(腐敗🧟♀️)
それを ACLで止めるのが、この教材のテーマです🧼🧱✨
2.5 プロジェクト構成(全体地図)🗺️🏗️
この教材では、最初から「分ける前提」で雛形を作ります😊✨ (後で分けようとすると、だいたいしんどいので…🥹)
4プロジェクト構成(おすすめ)💡
-
MiniECommerce.Api- Web API(エンドポイント、DI設定、起動)🌐
-
MiniECommerce.Application- “やりたいこと”(ユースケース)📌
-
MiniECommerce.Domain- “大事なルール”(型・不変条件・ドメインモデル)🧠🛡️
-
MiniECommerce.Infrastructure- DBや外部API、ACL(外側との接続)🔌🌪️
依存の向き(めちゃ大事!)👇
2.6 ハンズオン:雛形を作る(Visual Studio)🧰🪄
Step 1:ソリューション作成🗂️
- 新規プロジェクト作成で「空のソリューション」またはソリューション作成
- ソリューション名:
MiniECommerce(好きな名前でOK)🫶
Step 2:プロジェクトを4つ追加➕
ソリューションに次を追加します👇
MiniECommerce.Api:ASP.NET Core Web API(または Empty + Minimal API)🌐MiniECommerce.Application:クラスライブラリ📌MiniECommerce.Domain:クラスライブラリ🛡️MiniECommerce.Infrastructure:クラスライブラリ🔌
※ 2026時点の最新スタックとして、.NET 10 / C# 14 を使う想定です。(Microsoft for Developers)
Step 3:参照設定(依存の向きを作る)🔗
参照はこう👇(ここ間違えると後で地獄🥹)
Application→DomainInfrastructure→ApplicationとDomainApi→ApplicationとInfrastructure
💡 Visual Studio: 各プロジェクトの 依存関係 → プロジェクト参照の追加 でOKです✅
Step 4:ソリューションフォルダを作る(見た目の整理)📁✨
ソリューション上で、フォルダを作るとスッキリします💕
src(4プロジェクトを入れる)docs(後でメモや図を置くなら)
2.7 ハンズオン:雛形を作る(VS Code / CLI)⌨️🧰
VS Code派は、コマンドで一気に作れます🚀 (慣れてる人はこっちが速い✨)
mkdir MiniECommerce
cd MiniECommerce
dotnet new sln -n MiniECommerce
dotnet new webapi -n MiniECommerce.Api -f net10.0
dotnet new classlib -n MiniECommerce.Domain -f net10.0
dotnet new classlib -n MiniECommerce.Application -f net10.0
dotnet new classlib -n MiniECommerce.Infrastructure -f net10.0
dotnet sln add .\MiniECommerce.Api\MiniECommerce.Api.csproj
dotnet sln add .\MiniECommerce.Domain\MiniECommerce.Domain.csproj
dotnet sln add .\MiniECommerce.Application\MiniECommerce.Application.csproj
dotnet sln add .\MiniECommerce.Infrastructure\MiniECommerce.Infrastructure.csproj
dotnet add .\MiniECommerce.Application\MiniECommerce.Application.csproj reference .\MiniECommerce.Domain\MiniECommerce.Domain.csproj
dotnet add .\MiniECommerce.Infrastructure\MiniECommerce.Infrastructure.csproj reference .\MiniECommerce.Application\MiniECommerce.Application.csproj
dotnet add .\MiniECommerce.Infrastructure\MiniECommerce.Infrastructure.csproj reference .\MiniECommerce.Domain\MiniECommerce.Domain.csproj
dotnet add .\MiniECommerce.Api\MiniECommerce.Api.csproj reference .\MiniECommerce.Application\MiniECommerce.Application.csproj
dotnet add .\MiniECommerce.Api\MiniECommerce.Api.csproj reference .\MiniECommerce.Infrastructure\MiniECommerce.Infrastructure.csproj
2.8 動作確認:最初の “Ping” を作って起動する ✅🚀
MiniECommerce.Api の Program.cs に、まずは生存確認エンドポイントを追加します🐣✨
(Minimal APIの書き方はこの形が基本です)(Microsoft Learn)
app.MapGet("/ping", () => Results.Ok(new { message = "pong 🏓" }));
起動して、ブラウザで👇を開いて確認します😊
https://localhost:xxxx/ping
{"message":"pong 🏓"} が返ってきたらOK🎉🎉🎉
2.9 ここから先の“作業の進み方”イメージ 🧭📚
この教材は、毎章こんな感じで進みます👇✨
- 地図を見る(内側/外側/境界を意識)🗺️
- 小さく実装(壊れにくい形で)🧩
- 変換テストで守りを固める✅
- 外部が変でも、内側はいつもキレイ🧼🧱
2.10 ミニ課題:フォルダ構成の意図を1行で説明✍️📝
次のどれかを、1行で書いてみてください(短くてOK)😊💕
- 「なぜ Domain を分けたの?」
- 「なぜ Infrastructure に外部API(ACL)を置くの?」
- 「Api が Domain を直接触らないのはなぜ?」
例(あくまで例だよ)👇
- 「外部の都合が変わっても、内側のルールを守るため」🧱✨
2.11 AI活用:フォルダ構成案を3パターン出させる 🤖🧠
Copilot / Codex などに、こう聞くと捗ります⚡
ミニECのACL教材用に、C#/.NET 10で
Api / Application / Domain / Infrastructure を前提にした
フォルダ構成案を3パターンください。
それぞれ「メリット/デメリット」も短く添えてください。
ACL(外部決済API・レガシー会員API)の置き場所も明示して。
💡コツ😊
- AIが出した案をそのまま採用しなくてOK🙆♀️
- 「依存の向き(Domainが外を知らない)」だけは死守🛡️
- 迷ったら、この章の4プロジェクト構成に戻ればOKです🫶