Starkt typade hubbar
Definiera typade hubbgränssnitt för kompileringstidssäkerhet och IntelliSense vid anrop av klientmetoder.
Starkt typade hubbar är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Problemet med strängbaserade metodnamn
Standardanrop i SignalR använder SendAsync("MethodName", ...) med magiska strängar. Ett stavfel i metodnamnet orsakar ett fel utan felmeddelande — klienten tar helt enkelt aldrig emot meddelandet. Starkt typade hubbar löser detta.
Definiera klientgränssnittet
Skapa ett gränssnitt som deklarerar varje metod som servern kan anropa på klienten. Metodnamnen och parametertyperna utgör ert kontrakt.
// 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);
}Skapa en starkt typad hubb
Ärv från Hub<T>, där T är ert klientgränssnitt. Egenskapen Clients är nu typad — IntelliSense visar tillgängliga metoder och stavfel blir kompileringsfel.
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
}
}Rikta meddelanden till specifika klienter med en typad hubb
Alla standardmetoder för målgrupper fungerar med den typade hubben: Clients.User, Clients.Group, Clients.Caller, Clients.Client — alla returnerar det typade gränssnittet.
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");
}Typad IHubContext
Injicera IHubContext<THub, TClient> i tjänster för att få samma kompileringskontroll när meddelanden skickas från platser utanför hubben.
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");
}
}Regler för klientgränssnitt
Metoder i klientgränssnittet måste returnera Task (inte Task<T>). SignalR anropar klienten utan att invänta resultat — klienten returnerar inget värde till servern.
// 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 insteadKombinera typade hubbar med grupper
Typade grupper fungerar på samma sätt som otypade grupper — API:t är detsamma, men metodnamnen kontrolleras vid kompilering.
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);
}
}Testa starkt typade hubbar
Eftersom klientmetodanrop går via ett gränssnitt kan ni skapa en mock av klienten i enhetstester för att verifiera att rätt metoder anropades med rätt argument.
// 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!");Flera hubbar per program
Ett program kan ha flera hubbslutpunkter för olika realtidsfunktioner, där varje slutpunkt har ett eget typat klientgränssnitt.
// 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>Skicka strukturerade data
Metoder i klientgränssnitt kan ta emot komplexa DTO:er. SignalR serialiserar dem automatiskt till JSON — se till att era typer kan serialiseras.
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));Snabbkontroll
Vilken begränsning gäller returtypen för metoder i ett SignalR-klientgränssnitt för hubbar?
Sammanfattning: starkt typade hubbar
Viktiga punkter:
- Definiera ett gränssnitt (IMyClient) som listar alla metoder servern kan anropa på klienter
- Ärv från
Hub<IMyClient>— egenskapen Clients blir helt typad - Injicera
IHubContext<THub, TClient>för typade meddelanden från platser utanför hubben - Metoder i klientgränssnittet måste returnera
Task, inteTask<T> - Gränssnittsbaserade klienter kan mockas — starkt typade hubbar är enklare att testa
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Starkt typade hubbar” gratis?
Ja – hela texten till ”Starkt typade hubbar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Starkt typade hubbar”?
Definiera typade hubbgränssnitt för kompileringstidssäkerhet och IntelliSense vid anrop av klientmetoder. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Starkt typade hubbar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- SignalR-hubbar och anslutningar
- Grupper, användare och anslutningshantering
- Starkt typade hubbar
- Skalning med Redis Backplane