Hubs fortement typés
Définissez des interfaces de hub typées pour bénéficier de la sécurité à la compilation et d’IntelliSense lors des appels de méthodes client.
Hubs fortement typés est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Le problème des noms de méthodes sous forme de chaînes
Les appels SignalR standard utilisent SendAsync("MethodName", ...) avec des chaînes magiques. Une faute dans le nom de la méthode provoque un échec silencieux : le client ne reçoit tout simplement jamais le message. Les hubs fortement typés résolvent ce problème.
Définition de l’interface client
Créez une interface qui déclare chaque méthode que le serveur peut appeler sur le client. Les noms des méthodes et les types de paramètres constituent votre contrat.
// 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);
}Création d’un hub fortement typé
Héritez de Hub<T>, où T est votre interface client. La propriété Clients est désormais typée : IntelliSense affiche les méthodes disponibles et les fautes de frappe deviennent des erreurs de compilation.
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
}
}Ciblage de clients précis avec un hub typé
Toutes les méthodes de ciblage standard fonctionnent avec le hub typé : Clients.User, Clients.Group, Clients.Caller, Clients.Client — toutes renvoient l’interface typée.
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 typé
Injectez IHubContext<THub, TClient> dans les services pour bénéficier de la même sécurité à la compilation lorsque vous envoyez des messages depuis l’extérieur du 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");
}
}Règles de l’interface client
Les méthodes de l’interface client doivent renvoyer Task et non Task<T>. SignalR lance les appels du client sans en attendre le résultat : le client ne renvoie aucune valeur au serveur.
// 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 insteadCombinaison des hubs typés avec les groupes
Les groupes typés fonctionnent exactement comme les groupes non typés : l’API est la même, avec en plus des noms de méthodes vérifiés à la compilation.
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 des hubs fortement typés
Comme les appels aux méthodes du client passent par une interface, vous pouvez simuler le client dans des tests unitaires afin de vérifier que les bonnes méthodes ont été appelées avec les bons arguments.
// 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!");Plusieurs hubs par application
Une application peut posséder plusieurs points de terminaison de hub pour différentes fonctionnalités en temps réel, chacun avec sa propre interface client typée.
// 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>Envoi de données structurées
Les méthodes de l’interface client peuvent accepter des DTO complexes. SignalR les sérialise automatiquement au format JSON : assurez-vous que vos types peuvent être sérialisés.
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));Vérification rapide
Quelle restriction s’applique au type de retour des méthodes d’une interface client de hub SignalR ?
Récapitulatif : hubs fortement typés
À retenir :
- Définissez une interface (IMyClient) qui répertorie toutes les méthodes que le serveur peut appeler sur les clients
- Héritez de
Hub<IMyClient>: la propriété Clients devient entièrement typée - Injectez
IHubContext<THub, TClient>pour effectuer des envois typés depuis l’extérieur du hub - Les méthodes de l’interface client doivent renvoyer
Task, et nonTask<T> - Les clients fondés sur une interface peuvent être simulés ; un hub fortement typé est plus facile à tester
Apprends C# avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 93
- Leçons
- 346
Questions Fréquemment Posées
La leçon « Hubs fortement typés » est-elle gratuite ?
Oui — le texte complet de « Hubs fortement typés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Hubs fortement typés » ?
Définissez des interfaces de hub typées pour bénéficier de la sécurité à la compilation et d’IntelliSense lors des appels de méthodes client. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Hubs fortement typés » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Hubs et connexions SignalR
- Groupes, utilisateurs et gestion des connexions
- Hubs fortement typés
- Mise à l’échelle avec un relais Redis