Bileşenler Arası İletişim ve DI
Üst ve alt bileşenler arasında veri aktarın, kademeli parametreleri kullanın ve hizmetleri bileşenlere enjekte edin.
Bileşenler Arası İletişim ve DI, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Bileşen İletişim Kalıpları
Blazor bileşenleri üç yönde iletişim kurar: üst bileşenden alt bileşene (Parameters), alt bileşenden üst bileşene (EventCallback) ve ağaç genelinde (CascadingParameters veya DI aracılığıyla paylaşılan hizmetler).
Üst Bileşenden Alt Bileşene: Parametreler
Bir bileşen özelliğini [Parameter] ile işaretleyerek üst bileşenden ayarlanabilir hâle getirin. Üst bileşen değerleri, bileşen etiketindeki HTML öznitelikleri olarak geçirir.
@* 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." />Alt Bileşenden Üst Bileşene: EventCallback
Alt bileşen bir EventCallback parametresi sunar. Üst bileşen bir işleyici yöntemi sağlar. Alt bileşen, bir olay gerçekleştiğinde bu işleyiciyi çağırır.
@* 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>Üst Bileşen Aracılığıyla Kardeş Bileşen İletişimi
Kardeş bileşenlerin iletişim kurması için verileri ortak üst bileşen üzerinden yönlendirin. Üst bileşen paylaşılan durumu tutar ve bunu alt bileşenlere parametre olarak geçirir.
@* 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 *@Kademeli Parametreler
Verileri her ara bileşenden tek tek geçirmek zorunda kalmadan tüm alt bileşenlere aktarabilmek için bir alt ağacı <CascadingValue> ile sarmalayın.
@* 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>@inject ile Hizmet Ekleme
Kayıtlı DI hizmetlerini doğrudan bileşenlere enjekte etmek için @inject yönergesini kullanın. Bu hizmetler çatı tarafından otomatik olarak çözümlenir.
@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}");
}Blazor Server'da Kapsamlı Hizmetler
Blazor Server'da DI kapsamı yalnızca tek bir istek boyunca değil, SignalR bağlantısının tüm ömrü boyunca sürer. Kapsamlı hizmetlerin bir devredeki tüm bileşenler arasında paylaşıldığını unutmayın.
// 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>();Yönlendirme için NavigationManager
Program aracılığıyla yönlendirme yapmak, geçerli URL'yi okumak ve yönlendirme olaylarını işlemek için NavigationManager'ı enjekte edin.
@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;
}
}Blazor WASM'de HttpClient
Blazor WebAssembly'de API'nizi çağırmak için önceden yapılandırılmış bir HttpClient enjekte edin. Bunu Program.cs içinde bir temel adresle kaydedin.
// 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();
}
}Gerçek Hayattan: Kullanıcı Bağlamı Hizmeti
Kapsamlı bir UserContextService, uygulama genelindeki birden çok bileşene enjekte edilir; her bileşen, özellikleri zincirleme aktarmaya gerek kalmadan aynı kullanıcı verilerini görür.
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>Hızlı Kontrol
Blazor Server'da "kapsamlı" bir DI hizmetinin ömrü ne kadar sürer?
Özet: Bileşen İletişimi ve DI
Temel çıkarımlar:
- Üst bileşen → Alt bileşen: [Parameter] özellikleri; zorunlu parametreler için [EditorRequired]
- Alt bileşen → Üst bileşen: EventCallback; üst bileşenin StateHasChanged çağrısını otomatik olarak tetikler
- Kardeş bileşenler: üst bileşenin durumu üzerinden yönlendirin veya paylaşılan bir DI hizmeti kullanın
- Ağaçlar arası: derin alt ağaçlar için CascadingValue/CascadingParameter
- Hizmetler için @inject; Blazor Server kapsamlı hizmetleri devre ömrü boyunca sürer
- Program aracılığıyla yönlendirme için NavigationManager
Sıkça Sorulan Sorular
“Bileşenler Arası İletişim ve DI” dersi ücretsiz mi?
Evet — “Bileşenler Arası İletişim ve DI” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Bileşenler Arası İletişim ve DI” dersinde ne öğreneceğim?
Üst ve alt bileşenler arasında veri aktarın, kademeli parametreleri kullanın ve hizmetleri bileşenlere enjekte edin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Bileşenler Arası İletişim ve DI” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Blazor Bileşen Modeli
- Veri Bağlama ve Olay İşleme
- Bileşenler Arası İletişim ve DI
- Blazor'da Durum Yönetimi