# Dependency Injection की बुनियाद — .NET Core: वेब API बनाएँ, टेस्ट करें और शिप करें

Source: https://www.geekswithgeeks.com/hi/dotnet-core/di-basics

> Interface और उसका implementation register करें और endpoint में पाएँ।

## बनाएँ नहीं, माँगें

अपने कोड में `new EmailSender()` लिखने के बजाय आप `IEmailSender` माँगते हैं और built-in container एक दे देता है। इससे कोड test करना आसान होता है क्योंकि tests नकली object दे सकते हैं।

## Register, resolve, उपयोग

Services को startup पर एक बार register करते हैं, और container उन्हें जहाँ माँगा जाए वहाँ देता है।

![तीन चरण: service register करें, resolve करें, उपयोग करें।](assets/figures/dotnet-core/section-5-map.svg) — चित्र 5.1 — Register, resolve और use।

## Register करें और inject करें

`AddScoped` जोड़ी को register करता है। `IGreeter` type का endpoint parameter अपने आप inject होता है।

```csharp
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 यही भूमिका निभाते हैं।

**Quiz:** Concrete class की जगह interface पर निर्भर क्यों रहें?

- [ ] Interfaces runtime पर तेज़ होते हैं
- [x] Implementations बदले जा सकते हैं, जैसे tests में नकली
- [ ] Compiler इसे ज़रूरी करता है
- [ ] Container की ज़रूरत ख़त्म हो जाती है

*Answer:* Implementations बदले जा सकते हैं, जैसे tests में नकली. Abstraction पर निर्भर रहने से caller बदले बिना implementation बदला जा सकता है।
