C# Academy · Pelajaran

Hub Bertipe Kuat

Definisikan interface hub bertipe untuk mendapatkan keamanan saat kompilasi dan IntelliSense pada pemanggilan metode klien.

Pelajaran 3 dari 412 langkah

Hub Bertipe Kuat adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Masalah dengan Nama Metode Berupa String

Panggilan SignalR standar menggunakan SendAsync("MethodName", ...) dengan string ajaib. Kesalahan ketik pada nama metode menyebabkan kegagalan diam-diam—klien sama sekali tidak menerima pesan. Hub bertipe kuat mengatasi masalah ini.

Mendefinisikan Antarmuka Klien

Buat antarmuka yang mendeklarasikan setiap metode yang dapat dipanggil server pada klien. Nama metode dan jenis parameter merupakan kontrak Anda.

// 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);
}

Membuat Hub Bertipe Kuat

Warisi dari Hub<T> dengan T sebagai antarmuka klien Anda. Properti Clients kini memiliki tipe—IntelliSense menampilkan metode yang tersedia, dan kesalahan ketik menjadi error kompilasi.

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
    }
}

Menargetkan Klien Tertentu dengan Hub Bertipe

Semua metode penargetan standar berfungsi pada hub bertipe: Clients.User, Clients.Group, Clients.Caller, Clients.Client—semuanya mengembalikan antarmuka bertipe.

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

IHubContext Bertipe

Suntikkan IHubContext<THub, TClient> ke dalam layanan untuk mendapatkan keamanan waktu kompilasi yang sama saat mengirim pesan dari luar hub.

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

Aturan Antarmuka Klien

Metode dalam antarmuka klien harus mengembalikan Task (bukan Task<T>). SignalR memanggil klien tanpa menunggu hasil—tidak ada nilai kembalian dari klien ke server.

// 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

Menggabungkan Hub Bertipe dengan Grup

Grup bertipe bekerja sama persis seperti grup tanpa tipe—antarmukanya sama, hanya nama metodenya diperiksa saat kompilasi.

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

Menguji Hub Bertipe

Karena pemanggilan metode klien berlangsung melalui antarmuka, Anda dapat membuat tiruan klien dalam pengujian unit untuk memverifikasi bahwa metode yang benar dipanggil dengan argumen yang tepat.

// 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!");

Beberapa Hub dalam Satu Aplikasi

Sebuah aplikasi dapat memiliki beberapa titik akhir hub untuk fitur waktu nyata yang berbeda, masing-masing dengan antarmuka klien bertipe sendiri.

// 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>

Mengirim Data Terstruktur

Metode antarmuka klien dapat menerima DTO kompleks. SignalR otomatis membuat serialisasinya ke JSON—pastikan tipe Anda dapat diserialisasi.

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));

Pemeriksaan Singkat

Apa batasan jenis nilai kembalian untuk metode dalam antarmuka klien hub SignalR?

Ringkasan: Hub Bertipe Kuat

Poin penting:

  • Tentukan antarmuka (IMyClient) yang mencantumkan semua metode yang dapat dipanggil server pada klien
  • Warisi dari Hub<IMyClient>—properti Clients menjadi sepenuhnya bertipe
  • Suntikkan IHubContext<THub, TClient> untuk pengiriman bertipe dari luar hub
  • Metode antarmuka klien harus mengembalikan Task, bukan Task<T>
  • Klien berbasis antarmuka dapat dibuat tiruannya—hub bertipe kuat lebih mudah diuji
Gratis untuk memulai

Belajar C# dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
93
Pelajaran
346

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Hub Bertipe Kuat” gratis?

Ya — teks lengkap “Hub Bertipe Kuat” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Hub Bertipe Kuat”?

Definisikan interface hub bertipe untuk mendapatkan keamanan saat kompilasi dan IntelliSense pada pemanggilan metode klien. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Hub Bertipe Kuat” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Hub & Koneksi SignalR
  2. Grup, Pengguna & Pengelolaan Koneksi
  3. Hub Bertipe Kuat
  4. Penskalaan dengan Redis Backplane
← Kembali ke C# Academy