diff --git a/src/activities/webhooks/Elsa.Webhooks.Persistence.MongoDb/Services/ElsaMongoDbContext.cs b/src/activities/webhooks/Elsa.Webhooks.Persistence.MongoDb/Services/ElsaMongoDbContext.cs index b6e978c3d5..08daad4b1f 100644 --- a/src/activities/webhooks/Elsa.Webhooks.Persistence.MongoDb/Services/ElsaMongoDbContext.cs +++ b/src/activities/webhooks/Elsa.Webhooks.Persistence.MongoDb/Services/ElsaMongoDbContext.cs @@ -1,5 +1,6 @@ using System; using Elsa.Persistence.MongoDb.Options; +using Elsa.Persistence.MongoDb.Services; using Elsa.Webhooks.Models; using Elsa.Webhooks.Persistence.MongoDb.Data; using Microsoft.Extensions.Options; @@ -11,9 +12,8 @@ public class ElsaMongoDbContext { public ElsaMongoDbContext(IOptions options) { - var connectionString = options.Value.ConnectionString; - var mongoClient = new MongoClient(connectionString); - var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(connectionString).DatabaseName; + var mongoClient = ElsaMongoDbDriverHelpers.CreateClient(options.Value); + var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(options.Value.ConnectionString).DatabaseName; if (databaseName == null) throw new Exception("Please specify a database name, either via the connection string or via the DatabaseName setting."); diff --git a/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Elsa.Secrets.Persistence.MongoDb.csproj b/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Elsa.Secrets.Persistence.MongoDb.csproj index 8c9e1bed89..c986dc810b 100644 --- a/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Elsa.Secrets.Persistence.MongoDb.csproj +++ b/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Elsa.Secrets.Persistence.MongoDb.csproj @@ -4,7 +4,7 @@ - net6.0 + netcoreapp3.1;net5.0;net6.0;net7.0 enable enable diff --git a/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Services/ElsaMongoDbContext.cs b/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Services/ElsaMongoDbContext.cs index 36186acb55..549cf031e2 100644 --- a/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Services/ElsaMongoDbContext.cs +++ b/src/modules/secrets/Elsa.Secrets.Persistence.MongoDb/Services/ElsaMongoDbContext.cs @@ -1,4 +1,5 @@ using Elsa.Persistence.MongoDb.Options; +using Elsa.Persistence.MongoDb.Services; using Elsa.Secrets.Models; using Elsa.Secrets.Persistence.MongoDb.Data; using Microsoft.Extensions.Options; @@ -10,9 +11,8 @@ public class ElsaMongoDbContext { public ElsaMongoDbContext(IOptions options) { - var connectionString = options.Value.ConnectionString; - var mongoClient = new MongoClient(connectionString); - var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(connectionString).DatabaseName; + var mongoClient = ElsaMongoDbDriverHelpers.CreateClient(options.Value); + var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(options.Value.ConnectionString).DatabaseName; if (databaseName == null) throw new Exception("Please specify a database name, either via the connection string or via the DatabaseName setting."); diff --git a/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Elsa.WorkflowSettings.Persistence.MongoDb.csproj b/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Elsa.WorkflowSettings.Persistence.MongoDb.csproj index 210983d4e5..5bcba1ccf0 100644 --- a/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Elsa.WorkflowSettings.Persistence.MongoDb.csproj +++ b/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Elsa.WorkflowSettings.Persistence.MongoDb.csproj @@ -4,7 +4,7 @@ - netcoreapp3.1;net5.0;net6.0;net7.0 + netstandard2.1;net5.0;net6.0;net7.0 Elsa Workflow Settings is an optional part of Elsa Workflows. This package provides a MongoDb persistence provider. diff --git a/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Services/ElsaMongoDbContext.cs b/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Services/ElsaMongoDbContext.cs index b0de05f44e..ef76278654 100644 --- a/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Services/ElsaMongoDbContext.cs +++ b/src/modules/workflowsettings/Elsa.WorkflowSettings.Persistence.MongoDb/Services/ElsaMongoDbContext.cs @@ -1,5 +1,6 @@ using System; using Elsa.Persistence.MongoDb.Options; +using Elsa.Persistence.MongoDb.Services; using Elsa.WorkflowSettings.Models; using Elsa.WorkflowSettings.Persistence.MongoDb.Data; using Microsoft.Extensions.Options; @@ -11,9 +12,8 @@ public class ElsaMongoDbContext { public ElsaMongoDbContext(IOptions options) { - var connectionString = options.Value.ConnectionString; - var mongoClient = new MongoClient(connectionString); - var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(connectionString).DatabaseName; + var mongoClient = ElsaMongoDbDriverHelpers.CreateClient(options.Value); + var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(options.Value.ConnectionString).DatabaseName; if (databaseName == null) throw new Exception("Please specify a database name, either via the connection string or via the DatabaseName setting."); diff --git a/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj index 1993f62d27..ebab024de9 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj +++ b/src/persistence/Elsa.Persistence.MongoDb/Elsa.Persistence.MongoDb.csproj @@ -4,7 +4,7 @@ - netstandard2.1 + netstandard2.1;net5.0;net6.0;net7.0 Elsa is a set of workflow libraries and tools that enable super-fast workflowing capabilities in any .NET Core application. This package provides a MongoDb persistence provider. diff --git a/src/persistence/Elsa.Persistence.MongoDb/Options/ElsaMongoDbOptions.cs b/src/persistence/Elsa.Persistence.MongoDb/Options/ElsaMongoDbOptions.cs index aadedcdf9e..a30771cf90 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Options/ElsaMongoDbOptions.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Options/ElsaMongoDbOptions.cs @@ -10,5 +10,12 @@ public class ElsaMongoDbOptions /// /// public bool DoNotRegisterVariablesSerializer { get; set; } + + /// + /// If true it will use the new LINQ3 provider introduced in MongoDB.Driver 2.19.0 but + /// it has some breaking changes, so it is preferibly to enable only if you are really sure + /// that it works without any problem in your project. + /// + public bool UseNewLinq3Provider { get; set; } } } diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbContext.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbContext.cs index b33d8c7c5d..035eb7a84f 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbContext.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbContext.cs @@ -10,9 +10,8 @@ public class ElsaMongoDbContext : IElsaMongoDbContext { public ElsaMongoDbContext(IOptions options) { - var connectionString = options.Value.ConnectionString; - var mongoClient = new MongoClient(connectionString); - var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(connectionString).DatabaseName; + var mongoClient = ElsaMongoDbDriverHelpers.CreateClient(options.Value); + var databaseName = options.Value.DatabaseName is not null and not "" ? options.Value.DatabaseName : MongoUrl.Create(options.Value.ConnectionString).DatabaseName; if (databaseName == null) throw new Exception("Please specify a database name, either via the connection string or via the DatabaseName setting."); diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbDriverHelpers.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbDriverHelpers.cs new file mode 100644 index 0000000000..ea0d0eec71 --- /dev/null +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/ElsaMongoDbDriverHelpers.cs @@ -0,0 +1,33 @@ +using Elsa.Persistence.MongoDb.Options; +using MongoDB.Driver; +using System; +using System.Collections.Concurrent; + +namespace Elsa.Persistence.MongoDb.Services +{ + public static class ElsaMongoDbDriverHelpers + { + /// + /// Avoid creating too much instances for MongoClient. + /// + private static readonly ConcurrentDictionary _clients = new(); + + public static MongoClient CreateClient(ElsaMongoDbOptions options) + { + if (string.IsNullOrEmpty(options.ConnectionString)) throw new ArgumentException("Connection string is required.", nameof(options.ConnectionString)); + if (!_clients.TryGetValue(options.ConnectionString, out MongoClient client)) + { + var connectionString = options.ConnectionString; + var clientSettings = MongoClientSettings.FromConnectionString(connectionString); + if (options.UseNewLinq3Provider == false) + { + clientSettings.LinqProvider = MongoDB.Driver.Linq.LinqProvider.V2; + } + client = new MongoClient(clientSettings); + _clients[options.ConnectionString] = client; + } + + return client; + } + } +}