Hub fortemente tipizzati
Definisca interfacce tipizzate per gli hub, ottenendo sicurezza in fase di compilazione e IntelliSense per le chiamate ai metodi del client.
Hub fortemente tipizzati è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Il problema dei nomi dei metodi sotto forma di stringhe
Le chiamate SignalR standard utilizzano SendAsync("MethodName", ...) con stringhe magiche. Un errore di battitura nel nome del metodo causa un errore silenzioso: il client semplicemente non riceve mai il messaggio. Gli hub fortemente tipizzati risolvono questo problema.
Definizione dell'interfaccia client
Crei un'interfaccia che dichiari ogni metodo che il server può invocare sul client. I nomi dei metodi e i tipi dei parametri costituiscono il contratto.
// 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);
}Creazione di un hub fortemente tipizzato
Erediti da Hub<T>, dove T è l'interfaccia client. La proprietà Clients è ora tipizzata: IntelliSense mostra i metodi disponibili e gli errori di battitura diventano errori di compilazione.
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
}
}Indirizzamento di client specifici con un hub tipizzato
Tutti i metodi standard di indirizzamento funzionano nell'hub tipizzato: Clients.User, Clients.Group, Clients.Caller, Clients.Client; tutti restituiscono l'interfaccia tipizzata.
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 tipizzato
Inietti IHubContext<THub, TClient> nei servizi per ottenere la stessa sicurezza in fase di compilazione quando invia messaggi dall'esterno dell'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");
}
}Regole per l'interfaccia client
I metodi nell'interfaccia client devono restituire Task (non Task<T>). SignalR avvia le chiamate client senza attendere un risultato: il client non restituisce alcun valore al 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 insteadCombinazione di hub tipizzati e gruppi
I gruppi tipizzati funzionano esattamente come quelli non tipizzati: l'API è la stessa, ma i nomi dei metodi vengono verificati in fase di compilazione.
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);
}
}Test degli hub fortemente tipizzati
Poiché le chiamate ai metodi client passano attraverso un'interfaccia, nei test unitari può simulare il client per verificare che siano stati chiamati i metodi corretti con gli argomenti appropriati.
// 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!");Più hub per applicazione
Un'applicazione può avere più endpoint hub per diverse funzionalità in tempo reale, ciascuno con la propria interfaccia client tipizzata.
// 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>Invio di dati strutturati
I metodi dell'interfaccia client possono accettare DTO complessi. SignalR li serializza automaticamente in JSON: si assicuri che i tipi siano serializzabili.
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));Verifica rapida
Qual è il vincolo sul tipo restituito dai metodi di un'interfaccia client di un hub SignalR?
Riepilogo: hub fortemente tipizzati
Concetti chiave:
- Definisca un'interfaccia (IMyClient) che elenchi tutti i metodi che il server può chiamare sui client
- Erediti da
Hub<IMyClient>: la proprietà Clients diventa completamente tipizzata - Inietti
IHubContext<THub, TClient>per inviare messaggi tipizzati dall'esterno dell'hub - I metodi dell'interfaccia client devono restituire
Task, nonTask<T> - I client basati su interfacce possono essere simulati: gli hub fortemente tipizzati sono più facili da testare
Domande Frequenti
La lezione «Hub fortemente tipizzati» è gratuita?
Sì — il testo completo di «Hub fortemente tipizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Hub fortemente tipizzati»?
Definisca interfacce tipizzate per gli hub, ottenendo sicurezza in fase di compilazione e IntelliSense per le chiamate ai metodi del client. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Hub fortemente tipizzati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Hub e connessioni SignalR
- Gruppi, utenti e gestione delle connessioni
- Hub fortemente tipizzati
- Scalabilità con Redis Backplane