0Pricing
C# Academy · Leçon

Communication entre composants et DI

Transmettez des données entre les composants parent et enfant, utilisez des paramètres en cascade et injectez des services dans les composants.

Communication entre composants et DI est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Schémas de communication entre composants

Les composants Blazor communiquent dans trois directions : du parent vers l’enfant (paramètres), de l’enfant vers le parent (EventCallback) et à travers l’arbre (CascadingParameters ou services partagés via DI).

Du parent à l’enfant : paramètres

Décorez une propriété de composant avec [Parameter] pour permettre au parent de lui attribuer une valeur. Le parent transmet les valeurs sous forme d’attributs HTML sur la balise du composant.

@* Child: Alert.razor *@
<div class="alert alert-@Type">
    @Message
</div>

@code {
    [Parameter] public string Type { get; set; } = "info"; // primary, warning, danger
    [Parameter, EditorRequired] public string Message { get; set; } = "";
}

@* Parent usage: *@
<Alert Type="danger" Message="Something went wrong!" />
<Alert Message="Record saved." />

De l’enfant au parent : EventCallback

Un composant enfant expose un paramètre EventCallback. Le parent fournit une méthode gestionnaire. L’enfant l’appelle lorsqu’un événement se produit.

@* Child: QuantityPicker.razor *@
<button @onclick="() => OnChanged.InvokeAsync(Value - 1)">-</button>
<span>@Value</span>
<button @onclick="() => OnChanged.InvokeAsync(Value + 1)">+</button>

@code {
    [Parameter] public int Value { get; set; } = 1;
    [Parameter] public EventCallback<int> OnChanged { get; set; }
}

@* Parent: *@
<QuantityPicker Value="@_qty" OnChanged="q => _qty = q" />
<p>Quantity: @_qty</p>

Communication entre composants frères via le parent

Pour permettre à des composants frères de communiquer, faites transiter les données par leur parent commun. Le parent conserve l’état partagé et le transmet aux enfants sous forme de paramètres.

@* Parent holds shared state *@
<CategoryFilter OnChanged="c => _category = c" />
<ProductList Category="_category" />

@code {
    private string _category = "All";
}

@* CategoryFilter raises an event -> Parent updates _category
   -> ProductList re-renders with new Category *@

Paramètres en cascade

Encapsulez un sous-arbre dans <CascadingValue> pour transmettre des données à tous les descendants sans les faire transiter par chaque composant intermédiaire.

@* Wrap a subtree *@
<CascadingValue Value="_theme">
    <MainLayout />
</CascadingValue>

@code { private Theme _theme = new Theme { PrimaryColor = "#6366f1" }; }

@* Any descendant can receive it: *@
@code {
    [CascadingParameter]
    public Theme AppTheme { get; set; } = default!;
}

<h1 style="color: @AppTheme.PrimaryColor">Hello</h1>

Injection de services avec @inject

Utilisez la directive @inject pour injecter directement dans les composants les services DI enregistrés. Le framework les résout automatiquement.

@inject IProductService ProductSvc
@inject ILogger<ProductList> Logger
@inject NavigationManager Nav

@code {
    private List<Product> _products = new();

    protected override async Task OnInitializedAsync()
    {
        Logger.LogInformation("Loading products");
        _products = await ProductSvc.GetAllAsync();
    }

    private void GoToProduct(int id)
        => Nav.NavigateTo($"/products/{id}");
}

Services à portée dans Blazor Server

Dans Blazor Server, la portée DI dure pendant toute la durée de vie de la connexion SignalR — et non pas seulement le temps d’une requête. Notez que les services à portée sont partagés entre tous les composants d’un circuit.

// Blazor Server: scoped = per circuit (connection lifetime)
builder.Services.AddScoped<CartService>();
// All components in the same browser tab share the SAME CartService

// This is GOOD for cart state (user's items persist across pages)
// This is BAD for request-scoped data — treat as session-like scope

// For true per-render-cycle scope, create your own:
using var scope = ScopeFactory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();

NavigationManager pour le routage

Injectez NavigationManager pour naviguer par programmation, lire l’URL actuelle et gérer les événements de navigation.

@inject NavigationManager Nav

@code {
    private void GoHome()         => Nav.NavigateTo("/");
    private void GoToProduct(int id) => Nav.NavigateTo($"/products/{id}");
    private void ForceReload()    => Nav.NavigateTo("/", forceLoad: true);

    protected override void OnInitialized()
    {
        // Read current URL
        var uri = Nav.Uri;
        var path = new Uri(uri).AbsolutePath;
    }
}

HttpClient dans Blazor WASM

Dans Blazor WebAssembly, injectez un HttpClient préconfiguré pour appeler votre API. Enregistrez-le avec une adresse de base dans Program.cs.

// Program.cs (Blazor WASM)
builder.Services.AddScoped(sp => new HttpClient
{
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});

// Component:
@inject HttpClient Http

@code {
    private List<Product> _products = new();

    protected override async Task OnInitializedAsync()
    {
        _products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
    }
}

Cas réel : service de contexte utilisateur

Un UserContextService à portée est injecté dans plusieurs composants de l’application : chacun accède aux mêmes données utilisateur sans devoir transmettre manuellement les propriétés.

public class UserContextService
{
    public string? Name { get; private set; }
    public bool IsAdmin { get; private set; }

    public async Task InitializeAsync(AuthenticationState auth)
    {
        var user = auth.User;
        Name = user.Identity?.Name;
        IsAdmin = user.IsInRole("Admin");
    }
}

// Registered as scoped:
builder.Services.AddScoped<UserContextService>();

// Used in any component:
@inject UserContextService UserCtx
<p>Hello, @UserCtx.Name @(UserCtx.IsAdmin ? "(Admin)" : "")</p>

Vérification rapide

Dans Blazor Server, combien de temps dure la durée de vie d’un service DI « à portée » ?

Récapitulatif : communication entre composants et DI

Points clés :

  • Parent → enfant : propriétés de paramètre ; [EditorRequired] pour les paramètres obligatoires
  • Enfant → parent : EventCallback ; StateHasChanged est automatiquement déclenché sur le parent
  • Composants frères : faites transiter les données par l’état du parent ou utilisez un service DI partagé
  • À travers l’arbre : CascadingValue/CascadingParameter pour les sous-arbres profonds
  • @inject pour les services ; dans Blazor Server, les services à portée durent pendant toute la durée de vie du circuit
  • NavigationManager pour le routage par programmation

Questions Fréquemment Posées

La leçon « Communication entre composants et DI » est-elle gratuite ?

Oui — le texte complet de « Communication entre composants et DI » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Communication entre composants et DI » ?

Transmettez des données entre les composants parent et enfant, utilisez des paramètres en cascade et injectez des services dans les composants. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Communication entre composants et DI » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèle de composants Blazor
  2. Liaison de données et gestion des événements
  3. Communication entre composants et DI
  4. Gestion de l’état dans Blazor
← Retour à C# Academy