Επέκταση Υπηρεσιών (Extension Register Services) και Dependency Injection σε ASP.NET Core

Νίκος Σταυρόπουλος - Feb 18 - - Dev Community

Image description

Το ASP.NET Core βασίζεται στη φιλοσοφία της Dependency Injection (DI), η οποία επιτρέπει την εύκολη διαχείριση των εξαρτήσεων των αντικειμένων. Μια συνηθισμένη πρακτική είναι η χρήση Extension Methods για την καταχώρηση υπηρεσιών στο IServiceCollection, ώστε να διατηρείται ο κώδικας οργανωμένος και επαναχρησιμοποιήσιμος.


1. Dependency Injection και Service Registration

Τι είναι η Dependency Injection;

Η Dependency Injection (DI) είναι μια τεχνική στην οποία οι εξαρτήσεις ενός αντικειμένου περνιούνται από έξω αντί να δημιουργούνται μέσα στην κλάση. Αυτό:

  • Διευκολύνει τη συντήρηση του κώδικα.
  • Επιτρέπει την αντικατάσταση εξαρτήσεων για unit testing.
  • Κάνει τον κώδικα πιο modular και κατανοητό.

Πώς γίνεται η καταχώρηση υπηρεσιών στο ASP.NET Core;

Στο αρχείο Program.cs, μπορούμε να καταχωρήσουμε υπηρεσίες στο IServiceCollection μέσω του builder.Services.
Παράδειγμα:

var builder = WebApplication.CreateBuilder(args);

// Register a service
builder.Services.AddScoped<IMyService, MyService>();

var app = builder.Build();

app.Run();
Enter fullscreen mode Exit fullscreen mode

Σε αυτό το παράδειγμα, η MyService εγγράφεται ως Scoped, που σημαίνει ότι δημιουργείται μία νέα instance ανά HTTP request.


2. Δημιουργία Extension Method για την Εγγραφή Υπηρεσιών

Για να διατηρούμε καθαρό και οργανωμένο τον Program.cs, μπορούμε να χρησιμοποιήσουμε extension methods για να ομαδοποιήσουμε την εγγραφή των υπηρεσιών μας.

Παράδειγμα δημιουργίας Extension Method

Δημιουργούμε ένα αρχείο ServiceExtensions.cs και ορίζουμε μια στατική κλάση με ένα extension method:

using Microsoft.Extensions.DependencyInjection;

public static class ServiceExtensions
{
    public static void AddCustomServices(this IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
        services.AddTransient<ILoggerService, LoggerService>();
    }
}
Enter fullscreen mode Exit fullscreen mode

Και μετά στο Program.cs, απλά καλούμε:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCustomServices();

var app = builder.Build();

app.Run();
Enter fullscreen mode Exit fullscreen mode

Αυτός ο τρόπος καθιστά τον Program.cs πιο καθαρό και ευανάγνωστο.


3. Υλοποίηση Interface και Class για Injection

Στο παράδειγμα που ακολουθεί, δημιουργούμε μια υπηρεσία για την επεξεργασία δεδομένων χρηστών.

Ορισμός Interface

public interface IUserService
{
    string GetUserName(int userId);
}
Enter fullscreen mode Exit fullscreen mode

Υλοποίηση Service Class

public class UserService : IUserService
{
    public string GetUserName(int userId)
    {
        return $"User_{userId}";
    }
}
Enter fullscreen mode Exit fullscreen mode

Εγγραφή στο DI Container μέσω Extension Method

public static class ServiceExtensions
{
    public static void AddApplicationServices(this IServiceCollection services)
    {
        services.AddScoped<IUserService, UserService>();
    }
}
Enter fullscreen mode Exit fullscreen mode

Και στο Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationServices();

var app = builder.Build();

app.Run();
Enter fullscreen mode Exit fullscreen mode

4. Χρήση της Υπηρεσίας σε Controller

Τώρα που έχουμε καταχωρήσει το IUserService στο DI Container, μπορούμε να το κάνουμε inject σε έναν Controller.

[ApiController]
[Route("api/users")]
public class UserController : ControllerBase
{
    private readonly IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet("{id}")]
    public IActionResult GetUser(int id)
    {
        var userName = _userService.GetUserName(id);
        return Ok(new { UserId = id, UserName = userName });
    }
}
Enter fullscreen mode Exit fullscreen mode

Τώρα, αν καλέσουμε GET /api/users/5, θα λάβουμε απάντηση:

{
  "UserId": 5,
  "UserName": "User_5"
}
Enter fullscreen mode Exit fullscreen mode

Συμπέρασμα

  • Το Dependency Injection (DI) είναι ένα κρίσιμο στοιχείο του ASP.NET Core για τη διαχείριση των υπηρεσιών.
  • Οι Extension Methods βοηθούν στην καλύτερη οργάνωση της εγγραφής υπηρεσιών, καθιστώντας τον κώδικα πιο καθαρό και modular.
  • Η χρήση Interfaces και Implementations επιτρέπει την καλύτερη συντήρηση και επεκτασιμότητα της εφαρμογής μας.

Ακολουθώντας αυτές τις πρακτικές, η αρχιτεκτονική της εφαρμογής γίνεται πιο καθαρή, δομημένη και εύκολη στη διαχείριση.

Δείτε επίσης Repository Pattern στη C# με SOLID αρχές

. . . . . . .