0Pricing
C# Academy · Lektion

Komponentenkommunikation und DI

Übergeben Sie Daten zwischen übergeordneten und untergeordneten Komponenten, verwenden Sie kaskadierende Parameter und injizieren Sie Dienste in Komponenten.

Komponentenkommunikation und DI ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Muster für die Kommunikation zwischen Komponenten

Blazor-Komponenten kommunizieren in drei Richtungen: von der übergeordneten zur untergeordneten Komponente (Parameters), von der untergeordneten zur übergeordneten Komponente (EventCallback) und über den Komponentenbaum hinweg (CascadingParameters oder gemeinsam genutzte Services über DI).

Von der übergeordneten zur untergeordneten Komponente: Parameters

Markieren Sie eine Komponenteneigenschaft mit [Parameter], damit sie von der übergeordneten Komponente gesetzt werden kann. Die übergeordnete Komponente übergibt Werte als HTML-Attribute am Komponententag.

@* 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." />

Von der untergeordneten zur übergeordneten Komponente: EventCallback

Eine untergeordnete Komponente stellt einen EventCallback-Parameter bereit. Die übergeordnete Komponente stellt eine Handler-Methode bereit. Die untergeordnete Komponente ruft sie auf, wenn etwas geschieht.

@* 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>

Kommunikation zwischen Geschwisterkomponenten über die übergeordnete Komponente

Damit Geschwisterkomponenten kommunizieren können, leiten Sie die Daten über die gemeinsame übergeordnete Komponente. Die übergeordnete Komponente verwaltet den gemeinsamen Zustand und übergibt ihn den untergeordneten Komponenten als Parameter.

@* 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 *@

Cascading Parameters

Umschließen Sie einen Teilbaum mit <CascadingValue>, um Daten an alle Nachkommen zu übergeben, ohne sie durch jede dazwischenliegende Komponente durchreichen zu müssen.

@* 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>

Services mit @inject injizieren

Verwenden Sie die @inject-Direktive, um registrierte DI-Services direkt in Komponenten zu injizieren. Das Framework löst sie automatisch auf.

@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}");
}

Scoped Services in Blazor Server

In Blazor Server besteht der DI-Scope während der gesamten Lebensdauer der SignalR-Verbindung — nicht nur während einer einzelnen Anfrage. Beachten Sie, dass Scoped Services von allen Komponenten innerhalb eines Circuits gemeinsam verwendet werden.

// 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 für Routing

Injizieren Sie NavigationManager, um programmgesteuert zu navigieren, die aktuelle URL auszulesen und Navigationsereignisse zu verarbeiten.

@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 in Blazor WASM

In Blazor WebAssembly injizieren Sie einen vorkonfigurierten HttpClient, um Ihre API aufzurufen. Registrieren Sie ihn mit einer Basisadresse in 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();
    }
}

Praxisbeispiel: UserContextService

Ein Scoped UserContextService wird in mehrere Komponenten der Anwendung injiziert — jede Komponente sieht dieselben Benutzerdaten, ohne dass sie per Prop-Drilling weitergereicht werden müssen.

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>

Schnelltest

Wie lange besteht die Lebensdauer eines als scoped registrierten DI-Services in Blazor Server?

Rückblick: Komponentenkommunikation und DI

Die wichtigsten Erkenntnisse:

  • Übergeordnete → untergeordnete Komponente: [Parameter]-Eigenschaften; [EditorRequired] für erforderliche Parameter
  • Untergeordnete → übergeordnete Komponente: EventCallback; löst StateHasChanged der übergeordneten Komponente automatisch aus
  • Geschwisterkomponenten: Zustand über die übergeordnete Komponente weiterleiten oder einen gemeinsam genutzten DI-Service verwenden
  • Über den Komponentenbaum hinweg: CascadingValue/CascadingParameter für tiefe Teilbäume
  • @inject für Services; Scoped Services in Blazor Server bestehen während der gesamten Circuit-Lebensdauer
  • NavigationManager für programmgesteuertes Routing

Häufig gestellte Fragen

Ist die Lektion „Komponentenkommunikation und DI“ kostenlos?

Ja — der vollständige Text von „Komponentenkommunikation und DI“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Komponentenkommunikation und DI“?

Übergeben Sie Daten zwischen übergeordneten und untergeordneten Komponenten, verwenden Sie kaskadierende Parameter und injizieren Sie Dienste in Komponenten. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Komponentenkommunikation und DI“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Blazor-Komponentenmodell
  2. Datenbindung und Ereignisbehandlung
  3. Komponentenkommunikation und DI
  4. Zustandsverwaltung in Blazor
← Zurück zu C# Academy