पाठ 15 / 26
Dependency Injection की बुनियाद
Interface और उसका implementation register करें और endpoint में पाएँ।
बनाएँ नहीं, माँगें
अपने कोड में new EmailSender() लिखने के बजाय आप IEmailSender माँगते हैं और built-in container एक दे देता है। इससे कोड test करना आसान होता है क्योंकि tests नकली object दे सकते हैं।
Register, resolve, उपयोग
Services को startup पर एक बार register करते हैं, और container उन्हें जहाँ माँगा जाए वहाँ देता है।
Register करें और inject करें
AddScoped जोड़ी को register करता है। IGreeter type का endpoint parameter अपने आप inject होता है।
builder.Services.AddScoped<IGreeter, Greeter>();
var app = builder.Build();
app.MapGet("/hi/{name}", (string name, IGreeter g) => g.Greet(name));
app.Run();
public interface IGreeter { string Greet(string name); }
public class Greeter : IGreeter
{
public string Greet(string name) => $"Hello, {name}!";
}कैंटीन काउंटर
आप अपना खाना खुद नहीं पकाते; काउंटर को बताते हैं कि क्या चाहिए। कैंटीन रसोइया बदले तो आपको फ़र्क़ नहीं पड़ता। आपके कोड और उसके helpers के बीच interfaces यही भूमिका निभाते हैं।
त्वरित जाँच: Concrete class की जगह interface पर निर्भर क्यों रहें?
- Interfaces runtime पर तेज़ होते हैं
- Implementations बदले जा सकते हैं, जैसे tests में नकली
- Compiler इसे ज़रूरी करता है
- Container की ज़रूरत ख़त्म हो जाती है
Answer
Implementations बदले जा सकते हैं, जैसे tests में नकली — Abstraction पर निर्भर रहने से caller बदले बिना implementation बदला जा सकता है।