第16章:VS CodeでもOK(.NET SDKで同じ設計)💻🌈
この章はね、「エディタがVSでもVS Codeでも、DIPの設計は同じだよ〜😊」を体で理解する回だよ✨ コマンドでプロジェクトを作って、VS Codeで実行▶️とデバッグ🐞まで一気にやるよ〜!
1) 今日のゴール🎯✨
- VS Code+.NET SDK だけで、DIP構成のサンプルを作れるようになる🧩
- **依存の向き(参照関係)**を、プロジェクト分割で“見える化”できる👀🔁
- VS Codeで ブレークポイント停止→変数確認までできる🐞🧠
2) まず「最新版」を入れて確認しよ🧰✨
現時点の最新版は **.NET 10.0.2(SDK 10.0.102 / C# 14.0)**だよ📦✨(2026-01-13リリース) (Microsoft)
✅ SDKが入ってるかチェック(ターミナル)
dotnet --version
dotnet --info
まだ入ってなければ、WindowsはインストーラでもWinGetでもOK👍 Microsoft Learnでも「WinGetで入れられるよ」って案内されてるよ🪟✨ (Microsoft Learn)
3) VS Codeに入れる拡張はこれだけ🧩💡
VS Code側は、基本この2つでOK:
- C# Dev Kit(ソリューションエクスプローラやテスト実行が強い✨)
- C# extension(v2以上)(Dev Kitが依存してるよ!)
C# Dev Kitは C# extension(2.0+)が必須で、さらに .NET Install Toolにも依存するよ〜ってFAQに書いてある🧠📌 (Visual Studio Code) (つまり「拡張を入れたら、足りないものは案内されやすい」って感じでラク😙)
4) DIPが“目でわかる”プロジェクト構成を作る🏗️✨

フォルダを作って、そこでターミナル開いてね😊 (VS Codeの画面下のターミナルでもOKだよ〜)
✅ 作るもの(3プロジェクト)
Dip.Core:上位(業務)💎Dip.Infrastructure:下位(DBなど)🧱Dip.App:起動する場所(Composition Root)🚪✨
✅ コマンドで一気に作成(Solution+Project)
mkdir DipSample
cd DipSample
dotnet new sln -n DipSample
dotnet new classlib -n Dip.Core
dotnet new classlib -n Dip.Infrastructure
dotnet new console -n Dip.App
dotnet sln add Dip.Core/Dip.Core.csproj
dotnet sln add Dip.Infrastructure/Dip.Infrastructure.csproj
dotnet sln add Dip.App/Dip.App.csproj
✅ 参照関係(ここがDIPのキモ!)🔁🧠
Dip.Coreは どこにも依存しない(最強の上位)🛡️Dip.InfrastructureはDip.Coreに依存する(下位→抽象へ)⬅️Dip.Appは両方参照して“組み立てる”(newする場所)🧩
dotnet add Dip.Infrastructure/Dip.Infrastructure.csproj reference Dip.Core/Dip.Core.csproj
dotnet add Dip.App/Dip.App.csproj reference Dip.Core/Dip.Core.csproj
dotnet add Dip.App/Dip.App.csproj reference Dip.Infrastructure/Dip.Infrastructure.csproj
Dip.Coreは どこにも依存しない(最強の上位)🛡️Dip.InfrastructureはDip.Coreに依存する(下位→抽象へ)⬅️Dip.Appは両方参照して“組み立てる”(newする場所)🧩
5) コードを書くよ✍️✨(最小DIPサンプル)
(1) Dip.Core:抽象(interface)と業務(Service)💎
Dip.Core/User.cs
namespace Dip.Core;
public sealed record User(int Id, string Name);
Dip.Core/IUserRepository.cs
namespace Dip.Core;
public interface IUserRepository
{
User? FindById(int id);
}
Dip.Core/UserService.cs
namespace Dip.Core;
public sealed class UserService
{
private readonly IUserRepository _repo;
public UserService(IUserRepository repo) => _repo = repo;
public string GetDisplayName(int id)
{
var user = _repo.FindById(id);
return user is null ? "ユーザーが見つからないよ😢" : $"こんにちは、{user.Name}さん🌸";
}
}
✅ここがDIPの気持ちいい所:
UserService(上位)は IUserRepository(抽象)しか知らない✨ DBがSQLでもファイルでも、上位は守られる🛡️💕
(2) Dip.Infrastructure:具体(InMemory実装)🧱
Dip.Infrastructure/InMemoryUserRepository.cs
using Dip.Core;
namespace Dip.Infrastructure;
public sealed class InMemoryUserRepository : IUserRepository
{
private static readonly List<User> _users =
[
new(1, "さくら"),
new(2, "みゆ"),
new(3, "あかり")
];
public User? FindById(int id) => _users.FirstOrDefault(x => x.Id == id);
}
(3) Dip.App:組み立て(newするのはここだけ)🚪✨
Dip.App/Program.cs
using Dip.Core;
using Dip.Infrastructure;
IUserRepository repo = new InMemoryUserRepository();
var service = new UserService(repo);
Console.WriteLine(service.GetDisplayName(2));
6) 実行してみよ▶️✨
dotnet run --project Dip.App/Dip.App.csproj
「こんにちは、みゆさん🌸」みたいに出たら成功🎉✨
7) VS Codeでデバッグする🐞🪄(ここが楽しい!)
✅ まずやること
- VS Codeで
DipSampleフォルダを開く📂 Program.csのConsole.WriteLine(...)の行の左をクリックして赤丸(ブレークポイント)🔴- F5でデバッグ開始▶️🐞
C# Dev Kitを使う場合、VS Code側の公式ドキュメントでは「launch.jsonを直接いじるデバッグは基本おすすめしないよ(必要ならOK)」ってスタンスだよ📌 (Visual Studio Code) (だからまずは Dev KitのRun/Debug体験に乗っかるのがラク!😆)
8) もし詰まったら(あるある集)🧯😄
❓C# Dev Kitのコマンドが出ない/動かない
- C# extension が v2以上じゃないとDev Kitが動かないことがあるよ⚠️ FAQでも明記されてる📌 (Visual Studio Code)
❓.NET SDKが見つからないと言われる
dotnet --versionが通るか確認✨- Dev Kit側が必要に応じて .NET を案内・自動導線にしてくれる説明もあるよ🧰 (Microsoft Learn)
❓launch.jsonが欲しい!
- もっと複雑なデバッグでは
launch.jsonが必要になることもあるよ🧩 そのときは、VS Code公式で「Copilotがlaunch.json生成を助けられるよ」って案内もある🥳 (Visual Studio Code) (ただしDev Kit流で回るなら、まずはそっち優先がスムーズ!)
9) 章末ミニ演習📝🌟(10〜20分)
演習A:実装差し替えごっこ🔁😆
InMemoryUserRepositoryをもう1個作って、名前を変えてみてねProgram.csのrepo = new ...を変えるだけで挙動が変わるのを確認🎛️✨
演習B:依存の向きを言葉で説明🗣️💖
- 「
Dip.CoreがDip.Infrastructureを参照しないのはなぜ?」を3行で説明してみて✍️ (“上位を守るため”が言えたら満点💯)
演習C:ブレークポイントで観察🐞👀
UserService.GetDisplayNameの中にブレークポイント置いて、userがnullかどうかをデバッグで見てみよ〜✨
次の第17章は、ここで作った構成をベースに「AI拡張でDIP設計を加速する」やつに入れるよ🤖🚗✨ もし第16章をさらに“授業っぽく”するなら、章末に**小テスト(○×/選択式)**も付けられるよ〜😙📘