Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to avoid using magic strings with the HubConnection class

I have a strongly typed Hub on the server:

public Foo : Hub<Bar> {}

Bar is supposed to be an interface including methods available on the client side. But that solves only half of the problem (the server half). On the client side, I still have to use magic strings to define handlers for calls to the methods of Bar:

 hubConnection.On<int>("MethodInsideBar", param => DoSomething(param));

Is there a way to avoid doing this ? Shouldn't there be a way to implement Bar client side and link the calls from the server to that implementation ?

like image 702
Abdelhakim Avatar asked Oct 20 '25 20:10

Abdelhakim


1 Answers

You can use the SignalR.Strong NuGet

Sample Code:
Foo.cs

public interface IBar
{
    Task MethodInsideBar(int n);
}
public class Foo : Hub<IBar> {}

Client.cs:

public class MySpoke : IBar
{
    public Task MethodInsideBar(int n)
    {
        // 
        return Task.CompletedTask;
    }
}

var conn = new SignalR.Client.HubConnection()
    .WithUrl("http://localhost:53353/MyHub")
    .Build();

await conn.StartAsync();

var registration = conn.RegisterSpoke<IBar>(new MySpoke())

BlazorPage.razor

@using Microsoft.AspNetCore.SignalR.Client
@using SignalR.Strong
@inject NavigationManager Nav
@implements IBar

@code {
    private HubConnection? hubConnection;

    public Task MethodInsideBar(int n)
    {
        // 
        return Task.CompletedTask;
    }

    protected override async Task OnInitializedAsync()
    {
        hubConnection = new HubConnectionBuilder()
            .WithUrl(Nav.ToAbsoluteUri("/foo"))
            .WithAutomaticReconnect()
            .Build();

        await hubConnection.StartAsync();

        hubConnection.RegisterSpoke<IBar>(this);

        await base.OnInitializedAsync();
    }
}

server.cs

public class FooBar
{
    private readonly IHubContext<Foo, IBar>? _hubContext;

    // dependency injected IHubContext
    public FooBar(IHubContext<Foo, IBar>? hubContext)
    {
        _hubContext = hubContext;
    }

    public void CallBar(int n)
    {
        _hubContext?.Clients.All.MethodInsideBar(n);
    }
}
like image 190
5andr0 Avatar answered Oct 24 '25 20:10

5andr0



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!