ChatGPTにDI(依存性注入)について聞いてみました。
タイトル、文章、イラスト: ChatGPT
登場人物
- ミナト(左): IT企業に入社したばかりの新人。C#歴半年。最近「DI」という単語にビビってる。
- ハルカ(右): 先輩エンジニア。業務で.NETを使い倒している。説明はわかりやすいと社内で評判。
1. 「DIって……何者ですか?」
ミナト「先輩! 最近プロジェクトのコードにAddTransientとかAddSingletonとか出てくるんですけど……それ何ですか?」
ハルカ「ああ、それは依存性注入(Dependency Injection)ってやつだね」
ミナト「あ、噂のDI! ……でも、なんでそんなことするんですか?」
ハルカ「じゃあ、ちょっと例で説明してみようか!」
2. 依存性って、そもそも何?
ハルカ「たとえば、アプリの中であいさつメッセージを出すクラスがあるとするよ」
C#:
public class GreetingService
{
public void Greet() => Console.WriteLine("こんにちは!");
}
ハルカ「これを別のクラスで使うとしたら、普通はこうやって書くよね」
C#:
public class MyApp
{
private GreetingService _greeting = new GreetingService();
public void Run() => _greeting.Greet();
}
ミナト「あ、見慣れたnewのやつですね」
ハルカ「うん。でもこれって、MyAppはGreetingServiceにガッツリ依存してるってことなんだ」
3. 依存性注入って何がうれしいの?
ハルカ「もしGreetingServiceをテスト用に差し替えたかったら……とか、複数の実装を切り替えたかったら……この書き方だと柔軟性がないんだよね」
ミナト「あ~、確かに毎回newしてたら変更もしづらそう……」
ハルカ「そこで! GreetingServiceを外から渡してあげる。これが依存性を注入するってこと」
C#:
public class MyApp
{
private readonly IGreetingService _greeting;
public MyApp(IGreetingService greeting)
{
_greeting = greeting;
}
public void Run() => _greeting.Greet();
}
ミナト「なるほど……でも、どうやって渡すんですか?」
ハルカ「そこを助けてくれるのがMicrosoft.Extensions.DependencyInjectionなんだ!」
4. 実際にDIコンテナに登録してみよう
C#:
var services = new ServiceCollection(); services.AddTransient<IGreetingService, GreetingService>(); services.AddTransient<MyApp>(); var provider = services.BuildServiceProvider(); var app = provider.GetRequiredService<MyApp>(); app.Run();
ミナト「うおっ! MyAppを取得するだけで、内部のGreetingServiceも自動で用意されてる!」
ハルカ「それがDIのすごいところ。使う側は依存するものを知らなくていい。全部DIコンテナがつないでくれる」
5. AddTransient/AddSingleton/AddScopedの違い
ハルカ「あと、サービスのライフサイクルも選べるよ」
| 登録方法 | インスタンス生成タイミング |
|---|---|
AddTransient |
毎回新しく |
AddScoped |
リクエストごと(Web用) |
AddSingleton |
アプリ起動からずっと同じ |
ミナト「なるほど、用途によって使い分けるんですね」
ハルカ「うん、特にWebアプリではAddScopedがよく使われるかな」
まとめ: DIはコードの見通しを良くしてくれる
ハルカ「DIは、クラス間の依存を外から注入して、テストしやすく、交換しやすくしてくれる仕組み」
ミナト「最初は魔法みたいだけど、仕組みがわかるとすごく納得です!」
ハルカ「これがわかると、今後Hostの中でConfigureServicesを見るたびに、『あ、あれDIの登録だ!』ってなるよ~」
ミナト「もうAddTransientが怖くないです!」

0 件のコメント:
コメントを投稿