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 件のコメント:
コメントを投稿