0Pricing
C# Academy · Ders

Güçlü Türlendirilmiş Hub'lar

İstemci yöntem çağrıları için derleme zamanı güvenliği ve IntelliSense desteği elde etmek üzere türü belirlenmiş hub arayüzleri tanımlayın.

Güçlü Türlendirilmiş Hub'lar, 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.

Dize Yöntem Adlarının Sorunu

Standart SignalR çağrıları, sihirli dizelerle SendAsync("MethodName", ...) kullanır. Yöntem adındaki bir yazım hatası sessiz bir hataya neden olur — istemci iletiyi hiçbir zaman almaz. Güçlü türlenmiş hub'lar bu sorunu çözer.

İstemci Arayüzünü Tanımlama

Sunucunun istemcide çağırabileceği her yöntemi bildiren bir arayüz oluşturun. Yöntem adları ve parametre türleri, sözleşmenizi oluşturur.

// INotificationClient.cs
public interface INotificationClient
{
    Task ReceiveMessage(string user, string message);
    Task OrderShipped(int orderId, string trackingNumber);
    Task UserJoined(string username);
    Task UserLeft(string username);
    Task SystemAlert(string message);
}

Güçlü Türlenmiş Hub Oluşturma

İstemci arayüzünüz olan T ile Hub<T> sınıfından türeyin. Clients özelliği artık tür denetimlidir — IntelliSense kullanılabilir yöntemleri gösterir ve yazım hataları derleme hatasına dönüşür.

public class ChatHub : Hub<INotificationClient>
{
    public async Task SendMessage(string message)
    {
        var user = Context.User!.Identity!.Name ?? "Anonymous";

        // Compile-time safety — no magic strings!
        await Clients.All.ReceiveMessage(user, message);
        await Clients.Others.UserJoined(user); // IntelliSense works
    }
}

Türlenmiş Hub ile Belirli İstemcileri Hedefleme

Tüm standart hedefleme yöntemleri türlenmiş hub'da çalışır: Clients.User, Clients.Group, Clients.Caller, Clients.Client — hepsi türlenmiş arayüzü döndürür.

public async Task NotifyOrderShipped(int orderId, string customerId)
{
    await Clients.User(customerId)
                 .OrderShipped(orderId, "TRK-12345");

    await Clients.Group("admins")
                 .SystemAlert($"Order {orderId} shipped to {customerId}");

    await Clients.Caller.ReceiveMessage("System", "Notification sent");
}

Türlenmiş IHubContext

Hub dışından ileti gönderirken aynı derleme zamanı güvenliğini elde etmek için hizmetlere IHubContext<THub, TClient> ekleyin.

public class ShipmentService
{
    private readonly IHubContext<ChatHub, INotificationClient> _hub;

    public ShipmentService(
        IHubContext<ChatHub, INotificationClient> hub) => _hub = hub;

    public async Task ProcessShipmentAsync(int orderId, string customerId)
    {
        // Fully typed — no magic strings
        await _hub.Clients.User(customerId)
                  .OrderShipped(orderId, "TRK-99999");
    }
}

İstemci Arayüzü Kuralları

İstemci arayüzündeki yöntemler Task döndürmelidir; Task<T> döndüremez. SignalR, istemci çağrılarını sonuç beklemeden başlatır — istemciden sunucuya dönen bir değer yoktur.

// CORRECT
public interface IMyClient
{
    Task ReceiveMessage(string msg);         // OK
    Task UpdateProgress(int percent);        // OK
    Task<string> GetUserInput();            // NOT SUPPORTED
}
// Return types other than Task are not supported in hub client interfaces
// For request-response patterns, use client-callable hub methods instead

Türlenmiş Hub'ları Gruplarla Birleştirme

Türlenmiş gruplar, türlenmemiş gruplarla aynı şekilde çalışır — API aynıdır, yalnızca yöntem adları derleme zamanında denetlenir.

public class RoomHub : Hub<IRoomClient>
{
    public async Task JoinRoom(string room)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, room);
        await Clients.Group(room).UserJoined(Context.User!.Identity!.Name!);
    }

    public async Task BroadcastToRoom(string room, string message)
    {
        var user = Context.User!.Identity!.Name!;
        await Clients.Group(room).ReceiveMessage(user, message);
    }
}

Güçlü Türlenmiş Hub'ları Test Etme

İstemci yöntem çağrıları bir arayüz üzerinden yapıldığından, doğru yöntemlerin doğru bağımsız değişkenlerle çağrıldığını doğrulamak için birim testlerinde istemciyi taklit edebilirsiniz.

// NSubstitute test
var mockClients = Substitute.For<IHubCallerClients<INotificationClient>>();
var mockAllClients = Substitute.For<INotificationClient>();
mockClients.All.Returns(mockAllClients);

var hub = new ChatHub { Clients = mockClients };
await hub.SendMessage("Hello!");

await mockAllClients.Received(1).ReceiveMessage("System", "Hello!");

Uygulama Başına Birden Çok Hub

Bir uygulamada farklı gerçek zamanlı özellikler için birden çok hub uç noktası bulunabilir ve her birinin kendine ait türlenmiş istemci arayüzü olabilir.

// Three separate hubs
app.MapHub<ChatHub>("/hubs/chat");
app.MapHub<NotificationHub>("/hubs/notifications");
app.MapHub<DashboardHub>("/hubs/dashboard");

// Each with its own client interface:
// Hub<IChatClient>, Hub<INotificationClient>, Hub<IDashboardClient>

Yapılandırılmış Veri Gönderme

İstemci arayüzü yöntemleri karmaşık DTO'ları kabul edebilir. SignalR bunları otomatik olarak JSON'a dönüştürür — türlerinizin serileştirilebilir olduğundan emin olun.

public interface IOrderClient
{
    Task OrderUpdated(OrderStatusDto status);
}

public record OrderStatusDto(
    int OrderId,
    string Status,
    decimal Total,
    DateTime UpdatedAt);

// Usage in hub:
await Clients.User(customerId).OrderUpdated(
    new OrderStatusDto(order.Id, order.Status.ToString(),
                       order.Total, DateTime.UtcNow));

Hızlı Kontrol

Bir SignalR hub istemci arayüzündeki yöntemlerin dönüş türüyle ilgili kısıtlama nedir?

Özet: Güçlü Türlenmiş Hub'lar

Temel çıkarımlar:

  • Sunucunun istemcilerde çağırabileceği tüm yöntemleri listeleyen bir arayüz (IMyClient) tanımlayın
  • Hub<IMyClient> sınıfından türeyin — Clients özelliği tamamen türlenmiş olur
  • Hub dışından türlenmiş gönderimler yapmak için IHubContext<THub, TClient> ekleyin
  • İstemci arayüzü yöntemleri Task döndürmelidir; Task<T> döndüremez
  • Arayüz tabanlı istemciler taklit edilebilir — güçlü türlenmiş hub'ların test edilmesi daha kolaydır

Sıkça Sorulan Sorular

“Güçlü Türlendirilmiş Hub'lar” dersi ücretsiz mi?

Evet — “Güçlü Türlendirilmiş Hub'lar” 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.

“Güçlü Türlendirilmiş Hub'lar” dersinde ne öğreneceğim?

İstemci yöntem çağrıları için derleme zamanı güvenliği ve IntelliSense desteği elde etmek üzere türü belirlenmiş hub arayüzleri tanımlayın. 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.

“Güçlü Türlendirilmiş Hub'lar” 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

  1. SignalR Hub'ları ve Bağlantılar
  2. Gruplar, Kullanıcılar ve Bağlantı Yönetimi
  3. Güçlü Türlendirilmiş Hub'lar
  4. Redis Backplane ile Ölçekleme
← C# Academy Sayfasına Dön