Sobes.tech
Middle

Για ποιο λόγο χρησιμοποιείται η εισαγωγή εξαρτήσεων (Dependency Injection);

sobes.tech AI

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

Ο εφοδιασμός εξαρτήσεων (Dependency Injection, DI) χρησιμοποιείται για τη διαχείριση των εξαρτήσεων μεταξύ των συστατικών μιας εφαρμογής.

Οι κύριοι στόχοι του DI:

  • Μείωση του συζευγμένου (Coupling): Τα συστατικά δεν δημιουργούν άμεσα τις εξαρτήσεις τους, αλλά τις λαμβάνουν από έξω. Αυτό καθιστά τα συστατικά πιο ανεξάρτητα και διευκολύνει την επαναχρησιμοποίησή τους.
  • Βελτίωση της δοκιμαστικότητας: Ο απομονωμένος έλεγχος μεμονωμένων συστατικών γίνεται πιο εύκολος, καθώς μπορούν να χρησιμοποιηθούν αντικείμενα mock ή ψεύτικα αντικείμενα αντί για πραγματικές εξαρτήσεις.
  • Αύξηση της ευελιξίας και επεκτασιμότητας: Είναι πιο εύκολο να αντικατασταθούν οι υλοποιήσεις των εξαρτήσεων χωρίς να αλλάξει ο κώδικας των συστατικών που τις χρησιμοποιούν.
  • Απλοποίηση της διαμόρφωσης: Οι εξαρτήσεις μπορούν να διαμορφωθούν κεντρικά, για παράδειγμα, κατά την εκκίνηση της εφαρμογής.

Οι κύριες προσεγγίσεις του DI:

  • Ενέσεις μέσω του κατασκευαστή (Constructor Injection): Οι εξαρτήσεις περνούν ως παράμετροι του κατασκευαστή. Αυτή είναι η πιο κοινή και συστηνόμενη προσέγγιση, καθώς διασφαλίζει την ύπαρξη όλων των απαραίτητων εξαρτήσεων κατά τη δημιουργία του αντικειμένου.

    // Εξάρτηση
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Συστατικό με εξάρτηση
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Ενέσεις μέσω του κατασκευαστή
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Κάνοντας κάτι.");
        }
    }
    
  • Ενέσεις μέσω ιδιότητας (Property Injection): Οι εξαρτήσεις ορίζονται μέσω δημόσιων ιδιοτήτων. Είναι λιγότερο προτιμητέο, καθώς δεν διασφαλίζει ότι η εξάρτηση θα έχει οριστεί.

    public class MyService
    {
        public ILogger Logger { get; set; } // Ενέσεις μέσω ιδιότητας
    
        public void DoSomething()
        {
            Logger?.Log("Κάνοντας κάτι."); // Έλεγχος null
        }
    }
    
  • Ενέσεις μέσω μεθόδου (Method Injection): Οι εξαρτήσεις περνούν ως παράμετροι της μεθόδου. Χρησιμοποιείται όταν η εξάρτηση χρειάζεται μόνο για την εκτέλεση μιας συγκεκριμένης μεθόδου.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Ενέσεις μέσω μεθόδου
        {
            logger.Log("Κάνοντας κάτι.");
        }
    }
    

Ο εφοδιασμός εξαρτήσεων υλοποιείται συχνά με τη βοήθεια ενός κοντέινερ DI (Inversion of Control Container), το οποίο διαχειρίζεται τον κύκλο ζωής των αντικειμένων και επιλύει τις εξαρτήσεις τους. Παραδείγματα δημοφιλών κοντέινερ DI στη .NET: Microsoft.Extensions.DependencyInjection (ενσωματωμένο), Autofac, Ninject, Castle Windsor.

Ο εφοδιασμός εξαρτήσεων είναι μια βασική αρχή για την κατασκευή εύκολα συντηρήσιμων, δοκιμασμένων και επεκτάσιμων εφαρμογών.