Το 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();
Σε αυτό το παράδειγμα, η 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>();
}
}
Και μετά στο Program.cs, απλά καλούμε:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCustomServices();
var app = builder.Build();
app.Run();
Αυτός ο τρόπος καθιστά τον Program.cs πιο καθαρό και ευανάγνωστο.
3. Υλοποίηση Interface και Class για Injection
Στο παράδειγμα που ακολουθεί, δημιουργούμε μια υπηρεσία για την επεξεργασία δεδομένων χρηστών.
Ορισμός Interface
public interface IUserService
{
string GetUserName(int userId);
}
Υλοποίηση Service Class
public class UserService : IUserService
{
public string GetUserName(int userId)
{
return $"User_{userId}";
}
}
Εγγραφή στο DI Container μέσω Extension Method
public static class ServiceExtensions
{
public static void AddApplicationServices(this IServiceCollection services)
{
services.AddScoped<IUserService, UserService>();
}
}
Και στο Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddApplicationServices();
var app = builder.Build();
app.Run();
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 });
}
}
Τώρα, αν καλέσουμε GET /api/users/5, θα λάβουμε απάντηση:
{
"UserId": 5,
"UserName": "User_5"
}
Συμπέρασμα
- Το Dependency Injection (DI) είναι ένα κρίσιμο στοιχείο του ASP.NET Core για τη διαχείριση των υπηρεσιών.
- Οι Extension Methods βοηθούν στην καλύτερη οργάνωση της εγγραφής υπηρεσιών, καθιστώντας τον κώδικα πιο καθαρό και modular.
- Η χρήση Interfaces και Implementations επιτρέπει την καλύτερη συντήρηση και επεκτασιμότητα της εφαρμογής μας.
Ακολουθώντας αυτές τις πρακτικές, η αρχιτεκτονική της εφαρμογής γίνεται πιο καθαρή, δομημένη και εύκολη στη διαχείριση.
Δείτε επίσης Repository Pattern στη C# με SOLID αρχές