From 0422066851735673cdc32aa4e2eb2b3928dad3ae Mon Sep 17 00:00:00 2001 From: HueByte Date: Thu, 19 Feb 2026 13:54:42 +0100 Subject: [PATCH] refactor: Update SignalRBroadcaster to use IServiceProvider for hub context retrieval --- .../Services/SignalRBroadcaster.cs | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/EchoHub.Server/Services/SignalRBroadcaster.cs b/src/EchoHub.Server/Services/SignalRBroadcaster.cs index 29d29a5..47dfd90 100644 --- a/src/EchoHub.Server/Services/SignalRBroadcaster.cs +++ b/src/EchoHub.Server/Services/SignalRBroadcaster.cs @@ -5,42 +5,53 @@ using Microsoft.AspNetCore.SignalR; namespace EchoHub.Server.Services; -public class SignalRBroadcaster( - IHubContext hubContext, - PresenceTracker presenceTracker) : IChatBroadcaster +public class SignalRBroadcaster : IChatBroadcaster { + private readonly IServiceProvider _serviceProvider; + private readonly PresenceTracker _presenceTracker; + private IHubContext? _hubContext; + + private IHubContext HubContext + => _hubContext ??= _serviceProvider.GetRequiredService>(); + + public SignalRBroadcaster(IServiceProvider serviceProvider, PresenceTracker presenceTracker) + { + _serviceProvider = serviceProvider; + _presenceTracker = presenceTracker; + } + public Task SendMessageToChannelAsync(string channelName, MessageDto message) - => hubContext.Clients.Group(channelName).ReceiveMessage(message); + => HubContext.Clients.Group(channelName).ReceiveMessage(message); public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) { if (excludeConnectionId is not null && !excludeConnectionId.StartsWith("irc-")) - return hubContext.Clients.GroupExcept(channelName, [excludeConnectionId]).UserJoined(channelName, username); + return HubContext.Clients.GroupExcept(channelName, [excludeConnectionId]).UserJoined(channelName, username); - return hubContext.Clients.Group(channelName).UserJoined(channelName, username); + return HubContext.Clients.Group(channelName).UserJoined(channelName, username); } public Task SendUserLeftAsync(string channelName, string username) - => hubContext.Clients.Group(channelName).UserLeft(channelName, username); + => HubContext.Clients.Group(channelName).UserLeft(channelName, username); public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) { if (channelName is not null) - return hubContext.Clients.Group(channelName).ChannelUpdated(channel); + return HubContext.Clients.Group(channelName).ChannelUpdated(channel); - return hubContext.Clients.All.ChannelUpdated(channel); + return HubContext.Clients.All.ChannelUpdated(channel); } public Task SendUserStatusChangedAsync(List channelNames, UserPresenceDto presence) { - var connections = presenceTracker.GetConnectionsInChannels(channelNames) + var connections = _presenceTracker.GetConnectionsInChannels(channelNames) .Where(c => !c.StartsWith("irc-")) .ToList(); if (connections.Count == 0) return Task.CompletedTask; - return hubContext.Clients.Clients(connections).UserStatusChanged(presence); + return HubContext.Clients.Clients(connections).UserStatusChanged(presence); } public Task SendErrorAsync(string connectionId, string message) @@ -48,6 +59,6 @@ public class SignalRBroadcaster( if (connectionId.StartsWith("irc-")) return Task.CompletedTask; - return hubContext.Clients.Client(connectionId).Error(message); + return HubContext.Clients.Client(connectionId).Error(message); } }