0Pricing
C# Academy · Lección

Hubs con tipos seguros

Defina interfaces de hub tipadas para obtener seguridad en tiempo de compilación e IntelliSense en las llamadas a métodos del cliente.

Hubs con tipos seguros es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

El problema de los nombres de métodos como cadenas

Las llamadas estándar de SignalR usan SendAsync("MethodName", ...) con cadenas mágicas. Un error tipográfico en el nombre del método provoca un fallo silencioso: el cliente simplemente nunca recibe el mensaje. Los hubs fuertemente tipados resuelven este problema.

Definición de la interfaz del cliente

Cree una interfaz que declare cada método que el servidor pueda invocar en el cliente. Los nombres de los métodos y los tipos de parámetros constituyen el contrato.

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

Creación de un hub fuertemente tipado

Herede de Hub<T>, donde T es la interfaz del cliente. La propiedad Clients ahora está tipada: IntelliSense muestra los métodos disponibles y los errores tipográficos se detectan como errores de compilación.

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

Dirigir mensajes a clientes específicos con un hub tipado

Todos los métodos estándar para dirigirse a clientes funcionan en el hub tipado: Clients.User, Clients.Group, Clients.Caller, Clients.Client; todos devuelven la interfaz tipada.

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 tipado

Inyecte IHubContext<THub, TClient> en los servicios para obtener la misma seguridad en tiempo de compilación al enviar mensajes desde fuera del 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");
    }
}

Reglas de la interfaz del cliente

Los métodos de la interfaz del cliente deben devolver Task (no Task<T>). SignalR inicia las invocaciones del cliente sin esperar su resultado; el cliente no devuelve ningún valor al servidor.

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

Combinar hubs tipados con grupos

Los grupos de los hubs tipados funcionan igual que los no tipados: la API es la misma, solo que los nombres de los métodos se comprueban en tiempo de compilación.

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

Pruebas de hubs fuertemente tipados

Como las llamadas a los métodos del cliente pasan por una interfaz, puede crear un mock del cliente en las pruebas unitarias para verificar que se llamaron los métodos correctos con los argumentos adecuados.

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

Varios hubs por aplicación

Una aplicación puede tener varios endpoints de hub para distintas funciones en tiempo real, cada uno con su propia interfaz de cliente tipada.

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

Envío de datos estructurados

Los métodos de la interfaz del cliente pueden aceptar DTO complejos. SignalR los serializa automáticamente a JSON; asegúrese de que sus tipos se puedan serializar.

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

Comprobación rápida

¿Cuál es la restricción del tipo de retorno para los métodos de una interfaz de cliente de un hub de SignalR?

Resumen: hubs fuertemente tipados

Aspectos clave:

  • Defina una interfaz (IMyClient) que enumere todos los métodos que el servidor puede invocar en los clientes
  • Herede de Hub<IMyClient>: la propiedad Clients pasa a estar completamente tipada
  • Inyecte IHubContext<THub, TClient> para enviar mensajes tipados desde fuera del hub
  • Los métodos de la interfaz del cliente deben devolver Task, no Task<T>
  • Los clientes basados en interfaces se pueden simular: los hubs fuertemente tipados son más fáciles de probar

Preguntas frecuentes

¿La lección «Hubs con tipos seguros» es gratis?

Sí — el texto completo de «Hubs con tipos seguros» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Hubs con tipos seguros»?

Defina interfaces de hub tipadas para obtener seguridad en tiempo de compilación e IntelliSense en las llamadas a métodos del cliente. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Hubs con tipos seguros»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Hubs y conexiones de SignalR
  2. Grupos, usuarios y gestión de conexiones
  3. Hubs con tipos seguros
  4. Escalado con Redis Backplane
← Volver a C# Academy