AzureSignalRFactory.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Microsoft.Azure.SignalR.Management;
  2. using Microsoft.Extensions.Logging;
  3. using Microsoft.Extensions.Options;
  4. using StackExchange.Redis;
  5. using System;
  6. using System.Collections.Concurrent;
  7. namespace TEAMModelOS.SDK.DI
  8. {
  9. public class AzureSignalRFactory
  10. {
  11. private readonly IServiceProvider _services;
  12. private readonly IOptionsMonitor<AzureSignalRFactoryOptions> _optionsMonitor;
  13. private ConcurrentDictionary<string, ServiceManager> ServiceManagers { get; } = new();
  14. private readonly ILogger _logger;
  15. public AzureSignalRFactory(IServiceProvider services, IOptionsMonitor<AzureSignalRFactoryOptions> optionsMonitor, ILogger<AzureSignalRFactory> logger)
  16. {
  17. _services = services ?? throw new ArgumentNullException(nameof(services));
  18. _optionsMonitor = optionsMonitor ?? throw new ArgumentNullException(nameof(optionsMonitor));
  19. _logger = logger;
  20. }
  21. public ServiceManager GetServiceManager(string name = "Default")
  22. {
  23. try
  24. {
  25. var serviceManager = ServiceManagers.GetOrAdd(name, x =>
  26. // TODO(Mickey) : Signalr SDK 1.10.0之後,aud會無法擴充,會變成asrs.u.aud,會造成無法使用restAPI,故先降回舊版
  27. new ServiceManagerBuilder().WithOptions(option =>
  28. {
  29. option.ConnectionString = _optionsMonitor.Get(name).SignalRConnectionString;
  30. option.ServiceTransportType = ServiceTransportType.Persistent;
  31. }).BuildServiceManager());
  32. return serviceManager;
  33. }
  34. catch (Exception e)
  35. {
  36. _logger?.LogWarning(e, e.Message);
  37. return null;
  38. }
  39. }
  40. }
  41. }