예제 #1
0
        /// <inheritdoc />
        public CosmosClient CreateCosmosClient(CosmosDataStoreConfiguration configuration)
        {
            EnsureArg.IsNotNull(configuration, nameof(configuration));

            var host = configuration.Host;
            var key  = configuration.Key;

            if (string.IsNullOrWhiteSpace(host) && string.IsNullOrWhiteSpace(key))
            {
                _logger.LogWarning("No connection string provided, attempting to connect to local emulator.");

                host = CosmosDbLocalEmulator.Host;
                key  = CosmosDbLocalEmulator.Key;
            }

            _logger.LogInformation("Creating CosmosClient instance for {DatabaseId}, Host: {Host}", configuration.DatabaseId, host);

            var builder = new CosmosClientBuilder(host, key)
                          .WithConnectionModeDirect(enableTcpConnectionEndpointRediscovery: true)
                          .WithCustomSerializer(new FhirCosmosSerializer())
                          .WithThrottlingRetryOptions(TimeSpan.FromSeconds(configuration.RetryOptions.MaxWaitTimeInSeconds), configuration.RetryOptions.MaxNumberOfRetries)
                          .AddCustomHandlers(_requestHandlers.ToArray());

            if (configuration.PreferredLocations?.Any() == true)
            {
                builder.WithApplicationPreferredRegions(configuration.PreferredLocations?.ToArray());
            }

            if (configuration.DefaultConsistencyLevel != null)
            {
                builder.WithConsistencyLevel(configuration.DefaultConsistencyLevel.Value);
            }

            return(builder.Build());
        }
예제 #2
0
        public static IServiceCollection AddCosmosDb(this IServiceCollection services, IConfiguration config)
        {
            if (!TryGetConnectionString(config, out var connectionString))
            {
                throw new InvalidOperationException("Could not obtain a connection string from configuration.");
            }

            var builder = new CosmosClientBuilder(connectionString)
                          .WithSerializerOptions(new CosmosSerializationOptions {
                PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
            })
                          .WithConnectionMode(config["CosmosDb:ConnectionMode"]);

            var regions = config.GetSection("CosmosDb:PreferredRegions").Get <string[]>();

            if (regions?.Length > 0)
            {
                builder = builder.WithApplicationPreferredRegions(regions);
            }

            services.AddSingleton(builder.Build());

            return(services.AddSingleton(provider =>
                                         provider.GetRequiredService <CosmosClient>()
                                         .GetContainer(config["CosmosDb:DatabaseId"], config["CosmosDb:ContainerId"])));
        }