Sobes.tech
Middle

Τι είναι η εισαγωγή εξαρτήσεων (DI) στο ASP.NET Core;

sobes.tech AI

Απάντηση από AI

Ο σχεδιασμός εξαρτήσεων (DI) είναι ένα μοτίβο σχεδίασης για την αντίστροφη διαχείριση ελέγχου (IoC), που επιτρέπει τη δημιουργία κώδικα με ασθενή συσχέτιση. Στο ASP.NET Core, το DI είναι μια ενσωματωμένη λειτουργία που διευκολύνει τη διαχείριση των εξαρτήσεων μεταξύ των κλάσεων.

Τα βασικά στοιχεία του DI στο ASP.NET Core:

  1. Υπηρεσίες: Αντικείμενα που παρέχουν λειτουργικότητα (π.χ. κλάσεις αποθετηρίων, υπηρεσίες καταγραφής).
  2. Κοντέινερ DI: Αντικείμενο που είναι υπεύθυνο για την επίλυση των εξαρτήσεων και τη δημιουργία στιγμιότυπων υπηρεσιών.
  3. Κύκλος ζωής υπηρεσιών: Καθορίζει πότε και πώς δημιουργούνται τα στιγμιότυπα υπηρεσιών:
    • Transient: Ένα νέο στιγμιότυπο δημιουργείται σε κάθε αίτημα υπηρεσίας.
    • Scoped: Ένα στιγμιότυπο ανά αίτημα (για web εφαρμογές — ανά HTTP αίτημα).
    • Singleton: Ένα στιγμιότυπο δημιουργείται κατά την πρώτη αίτηση και χρησιμοποιείται καθ' όλη τη διάρκεια της ζωής της εφαρμογής.

Πλεονεκτήματα της χρήσης DI:

  • Αδύναμος συσχετισμός: Οι κλάσεις εξαρτώνται από αφαιρέσεις (διασυνδέσεις), όχι από συγκεκριμένες υλοποιήσεις.
  • Δοκιμαστικότητα: Είναι εύκολο να αντικαταστήσετε τις πραγματικές εξαρτήσεις με "mocks" ή "stubs" κατά τη μονάδα δοκιμών.
  • Επεκτασιμότητα: Είναι εύκολο να αντικαταστήσετε τις υλοποιήσεις υπηρεσιών χωρίς να αλλάξετε τον κώδικα που εξαρτάται από αυτές.
  • Διαχείριση εξαρτήσεων: Το κοντέινερ DI διαχειρίζεται τον κύκλο ζωής και τη δημιουργία στιγμιότυπων.

Παράδειγμα εγγραφής υπηρεσιών στο Startup.csProgram.cs στο .NET 6+):

// Στη μέθοδο ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
    // Εγγραφή υπηρεσίας με κύκλο ζωής singleton
    services.AddSingleton<ILogger, EmailLogger>();

    // Εγγραφή υπηρεσίας με κύκλο ζωής scoped
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Εγγραφή υπηρεσίας με κύκλο ζωής transient
    services.AddTransient<ITransientService, TransientService>();

    // Εγγραφή ελεγκτών για εξάρτηση
    services.AddControllersWithViews();
}
Ενσωμάτωση εξαρτήσεων στον κατασκευαστή του ελεγκτή:

```csharp
public class HomeController : Controller
{
    private readonly ILogger _logger;
    private readonly IDataRepository _repository;

    // Το DI του ASP.NET Core επιλύει και ενέχει αυτόματα αυτές τις εξαρτήσεις
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... ενέργειες ελεγκτή
}