🌐
🔍 100%
👁️

Chapitre 4 : Architecture & Injection de Dépendances

Module : Programmation .Net C#

Niveau : 4ème Génie Informatique (Spécialité Data Science)

Prérequis : TP 4 validé (Architecture en couches)

Introduction

Dans le TP 4, vous avez franchi une étape majeure : vous avez sorti le code métier de la vue Razor. Vous êtes passés d'un code "brouillon" à une architecture découplée. Ce chapitre formalise ces concepts : pourquoi séparer les responsabilités ? Comment fonctionne l'injection de dépendances ? Qu'est-ce que l'asynchronisme ?

I. Architecture : Séparation des Responsabilités (SoC)

Le principe de base est la Separation of Concerns (Séparation des préoccupations). Une application moderne ne doit jamais mélanger :

Pourquoi ? Pour la maintenabilité. Si vous changez le design (HTML), vous ne devriez pas risquer de casser le calcul de la TVA.

II. L'Abstraction par Interfaces

Dans le TP, nous avons créé une interface ISensorService. Une interface est un contrat. Elle définit ce que le service doit faire, mais pas comment.

public interface ISensorService
{
    // Contrat : "Je promets de pouvoir fournir une liste de capteurs"
    List<SensorData> GetSensors();
}

Pourquoi utiliser des interfaces ?

Imaginez que vous vouliez tester votre application sans base de données, ou changer de fournisseur de données :

Grâce à l'interface, votre page MyDashboard.razor n'a pas besoin de changer. Elle ne connaît que le contrat ISensorService.

III. L'Injection de Dépendances (DI)

C'est le cœur d'ASP.NET Core. C'est un mécanisme où les objets ne créent pas leurs dépendances (avec new), mais les reçoivent.

1. Le Principe d'Inversion de Contrôle (IoC)

Au lieu que MyDashboard crée un new SensorService(), il dit au système : "J'ai besoin d'un ISensorService". Le système (le Conteneur IoC) lui en fournit un.

Vue (Razor) @inject ISensor 1. Demande Conteneur IoC SensorService 2. Injecte Instance Prête Utilisable

Figure 1 : Flux linéaire de l'Injection de Dépendances

2. Les 3 Cycles de Vie (Service Lifetimes)

Quand on enregistre un service dans Program.cs, on doit choisir sa durée de vie. C'est crucial pour la gestion de la mémoire.

Singleton 1 Même instance pour TOUT le monde Scoped (Par User) U1 U2 Une instance par session Transient Toujours nouveau

Figure 2 : Visualisation des Cycles de Vie

Mode Comportement Usage typique
Transient Une nouvelle instance est créée à chaque fois qu'on la demande. Services légers sans état (calculs simples).
Scoped Une instance unique créée par connexion utilisateur (Blazor) ou par requête HTTP (API). Services avec état utilisateur (Panier, Auth, DbContext). Le standard pour Blazor.
Singleton Une instance unique créée au démarrage et partagée par TOUS les utilisateurs. Cache global, Configuration, Service de logging.

IV. Programmation Asynchrone (Async / Await)

L'interface utilisateur (la Vue) tourne sur un "Thread principal". Si vous lancez une tâche longue (ex: charger des données pendant 5 secondes) sur ce thread, l'application fige.

1. L'Analogie du Restaurant

Imaginez un serveur dans un restaurant :

En C#, le mot-clé await est le moment où le serveur repart faire autre chose en attendant la réponse de la base de données.

2. Les Mots-clés

// Code Synchrone (Bloquant)
public List<Data> GetData() 
{
    Thread.Sleep(5000); // L'écran gèle 5 secondes
    return data;
}

// Code Asynchrone (Fluide)
public async Task<List<Data>> GetDataAsync() 
{
    await Task.Delay(5000); // L'écran reste réactif
    return data;
}

V. Synthèse

Chapter 4: Architecture & Dependency Injection

Module: .Net C# Programming

Level: 4th Year Computer Engineering (Data Science Specialty)

Prerequisite: LAB 4 Validated (Layered Architecture)

Introduction

In LAB 4, you achieved a major milestone: you moved business logic out of the Razor view. You transitioned from "messy" code to a decoupled architecture. This chapter formalizes these concepts: Why separate concerns? How does dependency injection work? What is asynchrony?

I. Architecture: Separation of Concerns (SoC)

The core principle is Separation of Concerns. A modern application should never mix:

Why? For maintainability. If you change the design (HTML), you shouldn't risk breaking the VAT calculation.

II. Abstraction via Interfaces

In the LAB, we created an ISensorService interface. An interface is a contract. It defines what the service must do, but not how.

public interface ISensorService
{
    // Contract: "I promise I can provide a list of sensors"
    List<SensorData> GetSensors();
}

Why use interfaces?

Imagine you want to test your app without a database, or switch data providers:

Thanks to the interface, your MyDashboard.razor page doesn't need to change. It only knows the contract ISensorService.

III. Dependency Injection (DI)

This is the heart of ASP.NET Core. It's a mechanism where objects don't create their dependencies (with new), but receive them.

1. Inversion of Control (IoC) Principle

Instead of MyDashboard creating a new SensorService(), it tells the system: "I need an ISensorService". The system (the IoC Container) provides one.

View (Razor) @inject ISensor 1. Requests IoC Container SensorService 2. Injects Instance Ready Usable

Figure 1: Linear Dependency Injection Flow

2. Service Lifetimes

When registering a service in Program.cs, we must choose its lifetime. This is critical for memory management.

Singleton 1 Same instance for EVERYONE Scoped (Per User) U1 U2 One instance per session Transient Always new

Figure 2: Lifetime Cycles

Mode Description Typical Usage
Transient A new instance is created every time it is requested. Lightweight, stateless services.
Scoped Unique instance created per user connection (Blazor Server) or per HTTP request (API). User-state services (Cart, Auth, DbContext). Standard for Blazor.
Singleton Unique instance created at startup and shared by ALL users. Global cache, Configuration, Logging.

IV. Asynchronous Programming (Async / Await)

The User Interface (UI) runs on a "Main Thread". If you run a long task (e.g., loading data for 5 seconds) on this thread, the app freezes.

1. The Restaurant Waiter Analogy

Imagine a waiter in a restaurant:

In C#, the keyword await is the moment the waiter goes to do something else while waiting for the database response.

2. Keywords

// Synchronous (Blocking)
public List<Data> GetData() 
{
    Thread.Sleep(5000); // Screen freezes for 5 seconds
    return data;
}

// Asynchronous (Smooth)
public async Task<List<Data>> GetDataAsync() 
{
    await Task.Delay(5000); // Screen remains responsive
    return data;
}

V. Synthesis

🎙️ Sélectionner une voix

🎙️ Select a voice