L'injection de dépendances dans .NET : un exemple pratique
L'injection de dépendances est un principe fondamental de la programmation orientée objet qui permet de découpler les dépendances entre les différentes parties de votre code. En .NET, l'injection de dépendances est fortement encouragée et facilitée par le framework. Dans cet article, nous allons explorer un exemple concret de l'injection de dépendances en .NET.
Scénario: Une application de gestion de livres
Imaginons une application simple qui gère une bibliothèque de livres. Cette application possède un service BookService
qui permet de gérer les livres, et un BookRepository
qui stocke les informations des livres en base de données.
public class BookService
{
private readonly IBookRepository _bookRepository;
public BookService(IBookRepository bookRepository)
{
_bookRepository = bookRepository;
}
public void AddBook(Book book)
{
_bookRepository.AddBook(book);
}
}
Dans cet exemple, BookService
dépend de l'interface IBookRepository
, qui définit les méthodes pour interagir avec la base de données. L'interface IBookRepository
est une abstraction qui nous permet de découpler le BookService
de l'implémentation concrète du repository.
public interface IBookRepository
{
void AddBook(Book book);
}
public class SqlBookRepository : IBookRepository
{
public void AddBook(Book book)
{
// Code pour ajouter un livre à la base de données SQL
}
}
public class InMemoryBookRepository : IBookRepository
{
public void AddBook(Book book)
{
// Code pour ajouter un livre à une liste en mémoire
}
}
Nous avons deux implémentations concrètes de IBookRepository
: SqlBookRepository
pour une base de données SQL et InMemoryBookRepository
pour une liste en mémoire. Grâce à l'injection de dépendances, nous pouvons choisir l'implémentation qui correspond à nos besoins sans modifier le BookService
.
Injection de dépendances avec le conteneur de services
Le framework .NET fournit un conteneur de services qui facilite l'injection de dépendances. Pour utiliser le conteneur de services, nous devons d'abord l'enregistrer dans notre application.
// Dans le fichier Startup.cs (ou Program.cs pour .NET 6)
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped();
services.AddScoped();
}
Dans cet exemple, nous enregistrons SqlBookRepository
comme l'implémentation de IBookRepository
, et nous enregistrons BookService
sans spécifier explicitement sa dépendance. Le conteneur de services va automatiquement injecter la dépendance IBookRepository
dans le BookService
.
Utilisation de l'injection de dépendances
Maintenant, nous pouvons utiliser le BookService
dans notre application sans avoir à nous soucier de l'implémentation du repository.
// Dans un contrôleur ASP.NET Core
public class BookController : ControllerBase
{
private readonly BookService _bookService;
public BookController(BookService bookService)
{
_bookService = bookService;
}
public IActionResult AddBook(Book book)
{
_bookService.AddBook(book);
// ...
}
}
Le conteneur de services va injecter une instance de BookService
dans le constructeur du BookController
. Le BookService
va ensuite utiliser l'instance de SqlBookRepository
qui a été enregistrée précédemment.
Conclusion
L'injection de dépendances est un outil puissant qui permet d'améliorer la modularité, la testabilité et la maintenabilité de votre code. En utilisant l'injection de dépendances, vous pouvez facilement découpler les dépendances entre les différentes parties de votre code et faciliter le développement et la maintenance. L'exemple ci-dessus illustre la simplicité et la flexibilité de l'injection de dépendances en .NET.