32章アウトライン(集約とトランザクション境界)🌸📘
- Windows + Visual Studio 2026(基本)🪟💻
- VS Code は「必要な章だけ」併用OK✌️
- C#(2026年の最新想定)+ .NET(同世代の最新想定)で進めるよ🚀
- Copilot / CodexなどAI拡張は「使える前提」で毎章ちょこちょこ使う🤖✨
第1章:この教材のゴール🎯✨
- 何ができるようになる?(集約を切れる/境界を置ける)💪
- 「整合性バグを減らす」ってどういう意味?🧠
- 最後に作るミニアプリのイメージ☕️📦
第2章:開発環境の準備(Windows + VS)🪟🛠️
- Visual Studioでソリューション作成の流れ📁
- Gitの最小運用(コミット粒度のコツ)🐙
- AI拡張の使い方ルール(丸投げ禁止の型)🤖⚠️
第3章:DDDってなに?こわくない版🧁
- DDD=業務の言葉をコードにする📖
- “難しいやつ全部”は後回しでOK🙆♀️
- 今日の主役「集約」だけ先に理解しよう🌟
第4章:トランザクションってなに?🔒
- 「全部成功 or 全部失敗」💥
- どこまでを1回で守るの?=境界の話🧱
- まずは「1ユースケース=1トランザクション」から😊
第5章:整合性ってなに?(即時 vs あとでOK)⏱️⏳
- “絶対守るルール”と“後で揃えばOK”の分け方⚖️
- UX(表示や文言)で不安を減らすコツ💬
- 例:支払い直後に発送が即反映じゃなくてもOK?🤔
第6章:EntityとValueObject(最小でOK)🧩
- Entity=IDで追う👤 / VO=値そのもの💰
- VOにするとバグが減る系(住所・金額・期間)🏠📅
- 集約の中でVOが効く理由✨
第7章:ユースケースと「境界」の関係🎬
- ユースケース=ユーザーがやりたい1行動👆
- 境界=その1行動で守る整合性の範囲🔒
- “境界はDBの都合じゃなく業務の都合”で決める🧠
第8章:題材ドメイン紹介(カフェ注文)☕️🍰
- Order / OrderItem / Payment / Customer などを登場させる👀
- ありがちな業務ルールを先に並べる📋
- AIに「ありそうなルール」を出させる🤖✨
第9章:ユビキタス言語(言葉合わせ)🗣️🌸
- 用語がズレると設計が壊れる😵
- “注文確定”と“支払い完了”の違いを言語化✅
- 小さな辞書を作る(1ページでOK)📖
第10章:最初のモデル図を描こう📦➡️
- 箱(概念)と線(関係)でOK✍️
- “更新される単位”に注目して描く👀
- ここで「集約の候補」をふわっと置く🌳
第11章:集約(Aggregate)ってなに?🌳
- 集約=一貫性を守る“まとまり”😊
- 目的=整合性バグを激減させる🛡️
- 集約は「大きいほど良い」じゃない⚠️
第12章:集約ルート(入口は1つ)👑🚪
- 外からはルート経由でしか更新できない🙅♀️
- ルートが不変条件を守る責任者✨
- “直接いじれない”が安全の鍵🔐
第13章:境界の判断軸①「同時に守る必要がある?」🧠⚖️
- 1回の更新で必ず守りたいルールはどれ?✅
- 「同じトランザクションで守りたいもの」を探す🔍
- 例:注文確定と明細追加は一緒?🤔
第14章:境界の判断軸②「参照はIDで持つ」🆔
- 他集約をオブジェクト参照しない(密結合防止)🧷
- 参照が必要なら Query で取りに行く🔎
- “更新はルート、参照は別”の感覚✨
第15章:境界の判断軸③「サイズ調整」⚖️😇
- 巨大集約の地獄(変更しにくい/遅い)💥
- 小さすぎ集約の地獄(跨ぎ更新したくなる)😵
- “だいたいこのくらい”の目安を持つ📏
第16章:境界を切る練習(ワーク3本)✍️🎀
- ケース1:カフェ注文(基本)☕️
- ケース2:サブスク課金(更新と参照が分かれやすい)💳
- ケース3:在庫引当(跨ぎ更新の誘惑が強い)📦
- AIに「境界案を3パターン」出させて比較🤖✨
第17章:不変条件(Invariants)ってなに?🔐
- “必ず守るルール”を散らさない📌
- 途中状態を壊さないための考え方🧠
- 例:「確定後は明細を追加できない」🧾🚫
第18章:C#で不変条件を守る①(生成とガード節)🛠️
- コンストラクタ/ファクトリで無効状態を作らない🏗️
- ガード節(早めに弾く)で安全に✨
- public setter禁止の理由(勝手に壊される)😇
第19章:C#で不変条件を守る②(更新メソッドと状態遷移)🔁
- “変更はメソッドに閉じ込める”✋
- 状態(Status)で許可/禁止を表現する🚦
- 後で状態機械に繋がる下地を作る🌈
第20章:ドメインエラーの設計(初心者向け)💬⚠️
- 例外をどこまで投げる?Result型は?🤔
- “ユーザーに見せるメッセージ”と“ログの詳細”を分ける🧾
- 境界(アプリ層)でエラーを整形する✨
第21章:レイヤード構成(置き場所で迷子にならない)🗂️
- Domain / Application / Infrastructure の役割ざっくり📚
- “ドメインはインフラを参照しない”ルール🧱
- Visual Studioのプロジェクト/フォルダ例📁
第22章:Repositoryは「集約単位」🏪
- OrderRepositoryはOK、OrderItemRepositoryは基本NG🙅♀️
- 取り出し/保存は集約ルート単位でやる🚪
- interface化して差し替えできるようにする🌟
第23章:Unit of Workの感覚(DbContextの立ち位置)🧠
- 変更をまとめて確定する仕組み💾
- “いつ確定するか”が境界そのもの🔒
- まずは難語を使わず感覚で掴む😊
第24章:EF Core導入(最小セット)🧪
- DbContext / DbSet の最小理解✨
- マッピング(Entity/VOの扱いの入口)🧩
- 開発用DB(ローカルで軽く回す)🪶
第25章:トランザクション境界の置き場所(結論:アプリ層)🎬🔒
- 基本:Application Service(ユースケース)に置く😊
- Domainはトランザクションを知らない方がキレイ✨
- 「1ユースケース=1境界」の型を固める📌
第26章:「1ユースケース=1トランザクション」実装💾✅
- 例:PlaceOrder(注文確定)を1回で完結させる☕️
- SaveChangesの位置を固定する🎯
- “途中で外部I/Oしない”の基本もセットで🧷
第27章:明示トランザクションが必要な場面だけ🔒🧠
- 基本は不要、必要なときだけ使う(理由つきで)👌
- 複数保存や整合性の要件で判断する⚖️
- AIに「このケース必要?」を聞いて根拠を確認🤖
第28章:同時更新って何が起きる?(事故から入る)🚑😅
- あるある:同じ注文を2人が同時に編集💥
- 何が壊れる?(上書き・二重処理)😵
- “検出できるだけでも価値”を理解する✨
第29章:楽観ロック(RowVersion)を入れてみる⚔️
- RowVersionの考え方(ぶつかったら止める)🧱
- 衝突時の挙動(再試行/やり直し)🔁
- ユーザー向け表示をやさしくする💬🌸
第30章:跨ぎ更新がしたくなる病(でも基本NG)🙅♀️😇
- 巨大トランザクション地獄の話💥
- “境界を守る”=未来の自分を守る🛡️
- 代わりの手段へ橋渡し(イベント/後処理)🌉
第31章:ドメインイベントと最終的整合性(入門)📣⏳
- イベント=「起きた事実」(過去形)✅
- 集約内で発行 → 外で処理(疎結合)🧠
- 状態(ステータス)で「いま何中」を見せる👀
- ちいさな状態機械っぽい表を作る🚦
第32章:Outboxと冪等性(現実運用の最低ライン)📮🔁
-
取りこぼし/二重送信の怖さを知る😱
-
Outboxの“考え方”を理解(まず概念でOK)📮
-
冪等性キーで二重処理を防ぐ🗝️
-
総合ミニ課題:
- 「注文確定→支払い→(遅れて)発送準備」まで一連で設計してみる☕️📦
- “どこが即時整合で、どこが最終的整合か”を言葉で説明できたら勝ち🏆✨
-
おまけ:次に進むなら(Saga / CQRS / 状態機械の深掘り)🚀