AzureCosmosFactory.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using Azure.Cosmos;
  2. using Microsoft.Extensions.Logging;
  3. using Microsoft.Extensions.Options;
  4. using System;
  5. using System.Collections.Concurrent;
  6. namespace TEAMModelOS.SDK.DI
  7. {
  8. public class AzureCosmosFactory
  9. {
  10. private readonly IServiceProvider _services;
  11. private readonly IOptionsMonitor<AzureCosmosFactoryOptions> _optionsMonitor;
  12. private readonly ILogger _logger;
  13. //private Option _option;
  14. private ConcurrentDictionary<string, CosmosClient> CosmosClients { get; } = new ConcurrentDictionary<string, CosmosClient>();
  15. // private CosmosDatabase database { get; set; }
  16. public AzureCosmosFactory(IServiceProvider services, IOptionsMonitor<AzureCosmosFactoryOptions> optionsMonitor, ILogger<AzureCosmosFactory> logger)
  17. {
  18. if (services == null) throw new ArgumentNullException(nameof(services));
  19. if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor));
  20. _services = services;
  21. _optionsMonitor = optionsMonitor;
  22. _logger = logger;
  23. }
  24. /// <summary>
  25. /// 取得CosmosClient,支持安全執行緒
  26. /// </summary>
  27. /// <param name="name"></param>
  28. /// <param name="region">可以使用Regions.{區域}設置,指定此屬性後,SDK會首選該區域來執行操作。此外,SDK會自動選擇後備的地理複製區域以實現高可用性。如果未指定此屬性,則SDK會將寫區域用作所有操作的首選區域</param>
  29. /// <returns></returns>
  30. public CosmosClient GetCosmosClient(string region = null, string name = "Default")
  31. {
  32. try
  33. {
  34. //CosmosClientOptions 的 SerializerOptions = new CosmosSerializationOptions() { PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase }
  35. //需等待官方修正
  36. var cm = CosmosClients.GetOrAdd(name, x => new CosmosClient(_optionsMonitor.Get(name).CosmosConnectionString, new CosmosClientOptions() { ApplicationRegion = region }));
  37. return cm;
  38. }
  39. catch (Exception e)
  40. {
  41. _logger?.LogWarning(e, e.Message);
  42. return null;
  43. }
  44. }
  45. }
  46. }