public static IServiceCollection AddCassandra(this IServiceCollection services) { var resolver = services.BuildServiceProvider(); using (var scope = resolver.CreateScope()) { var config = scope.ServiceProvider.GetService <IConfiguration>(); var cassandraOptions = new CassandraOptions(); config.Bind(CassandraSectionName, cassandraOptions); services.AddSingleton(cassandraOptions); var poolOptions = new PoolingOptions(); poolOptions.SetMaxRequestsPerConnection(Int32.MaxValue); var cluster = Cluster.Builder() .AddContactPoints(cassandraOptions.Host) .WithPort(cassandraOptions.Port) .WithAuthProvider(new PlainTextAuthProvider(cassandraOptions.UserName, cassandraOptions.Password)) .WithDefaultKeyspace(cassandraOptions.DefaultKeySpace) .WithPoolingOptions(poolOptions) .Build(); services.AddSingleton(x => cluster.Connect()); services.AddTransient <BookRepository>(); return(services); } }
/// <summary> /// Creates the <see cref="Cluster"/> object to connect to Azure CosmosDB Cassandra API /// </summary> /// <param name="hostName">Host name of the CosmosDB account, as shown in the "Connection String" section of Azure Portal</param> /// <param name="userName">UserName to connect to the CosmosDB account, as shown in the "Connection String" section of Azure Portal</param> /// <param name="password"> /// Password to connect the CosmosDB account, as shown in the "Connection String" section of Azure Portal. /// You can use either the "Primary Master ReadWrite" or "Seconday Master ReadWrite" keys here. /// </param> public static Cluster CreateClusterForCosmosDB(string hostName, string userName, string password) { // Refer https://docs.datastax.com/en/developer/java-driver/2.1/manual/pooling/ for more details PoolingOptions poolingOptions = new PoolingOptions(); poolingOptions.SetCoreConnectionsPerHost(HostDistance.Local, ClusterBuilderHelpers.CoreConnectionsPerHost); poolingOptions.SetMaxRequestsPerConnection(ClusterBuilderHelpers.MaxRequestsPerConnection); poolingOptions.SetMaxConnectionsPerHost(HostDistance.Local, ClusterBuilderHelpers.MaxConnectionsPerHost); // Increase the page size to Max to avoid multiple pagination calls. QueryOptions defaultOptions = new QueryOptions(); defaultOptions.SetPageSize(ClusterBuilderHelpers.DefaultPageSize); // Set a custom host name resolver to ensure that SSL does not fail with RemoteCertificateNameMismatch // Ensure that we return the same hostname is passed so that it can be matched with the CNAME from the certificate. SSLOptions sslOptions = new SSLOptions(SslProtocols.Tls12, checkCertificateRevocation: true, remoteCertValidationCallback: ValidateServerCertificate); sslOptions.SetHostNameResolver((ipAddress) => hostName); return(Cluster .Builder() .WithCredentials(userName, password) .WithPort(ClusterBuilderHelpers.CosmosDBCassandraPort) .WithQueryOptions(defaultOptions) .WithRetryPolicy(new LoggingRetryPolicy(new CosmosDBMultipleRetryPolicy(ClusterBuilderHelpers.MaxRetryOnRateLimiting))) .AddContactPoint(hostName) .WithSSL(sslOptions) .Build()); }