using Microsoft.Azure.SignalR.Management; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using StackExchange.Redis; using System; using System.Collections.Concurrent; namespace TEAMModelOS.SDK.DI { public class AzureSignalRFactory { private readonly IServiceProvider _services; private readonly IOptionsMonitor _optionsMonitor; private ConcurrentDictionary ServiceManagers { get; } = new(); private readonly ILogger _logger; public AzureSignalRFactory(IServiceProvider services, IOptionsMonitor optionsMonitor, ILogger logger) { _services = services ?? throw new ArgumentNullException(nameof(services)); _optionsMonitor = optionsMonitor ?? throw new ArgumentNullException(nameof(optionsMonitor)); _logger = logger; } public ServiceManager GetServiceManager(string name = "Default") { try { var serviceManager = ServiceManagers.GetOrAdd(name, x => // TODO(Mickey) : Signalr SDK 1.10.0之後,aud會無法擴充,會變成asrs.u.aud,會造成無法使用restAPI,故先降回舊版 new ServiceManagerBuilder().WithOptions(option => { option.ConnectionString = _optionsMonitor.Get(name).SignalRConnectionString; option.ServiceTransportType = ServiceTransportType.Persistent; }).BuildServiceManager()); return serviceManager; } catch (Exception e) { _logger?.LogWarning(e, e.Message); return null; } } } }