From ecbd56c5cc1cdba741cf6930b937cf9e601c01f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20R=C3=B6thinger?= Date: Sun, 26 Mar 2023 18:46:28 +0200 Subject: [PATCH] Added support for database patch actions --- ...xtensions.DependencyInjection.Tests.csproj | 4 +- .../LiteDatabaseServiceExtensionsTests.cs | 51 +++++++++++++++++++ ...teDB.Extensions.DependencyInjection.csproj | 12 ++--- .../LiteDatabaseFactory.cs | 25 ++++++++- .../LiteDatabaseServiceExtensions.cs | 1 + .../LiteDatabaseServiceOptions.cs | 9 ++++ 6 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/AleRoe.LiteDB.Extensions.DependencyInjection.Tests.csproj b/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/AleRoe.LiteDB.Extensions.DependencyInjection.Tests.csproj index 593aca1..63b4cf7 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/AleRoe.LiteDB.Extensions.DependencyInjection.Tests.csproj +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/AleRoe.LiteDB.Extensions.DependencyInjection.Tests.csproj @@ -1,7 +1,7 @@  - net6.0;net48 + net7.0;net48 false @@ -10,7 +10,7 @@ - + diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/LiteDatabaseServiceExtensionsTests.cs b/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/LiteDatabaseServiceExtensionsTests.cs index 76f94f6..0174159 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/LiteDatabaseServiceExtensionsTests.cs +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection.Tests/LiteDatabaseServiceExtensionsTests.cs @@ -51,6 +51,22 @@ public void AddLiteDatabaseTest_WithOptions() } } + [Test()] + public void AddLiteDatabaseTest_WithOptionsAndPatch() + { + var options = new LiteDatabaseServiceOptions(ConnectionString); + options.AddDatabasePatch(action => { action.UserVersion = 1; }); + using (var provider = new ServiceCollection() + .AddLiteDatabase(options) + .BuildServiceProvider()) + { + LiteDatabase database = null; + Assert.DoesNotThrow(() => database = provider.GetRequiredService()); + Assert.That(database.UserVersion, Is.EqualTo(1)); + } + } + + [Test()] public void AddLiteDatabaseTest_WithOptions_SupportsLogging() { @@ -107,6 +123,41 @@ public void AddLiteDatabaseTest_WithConfigure() } } + [Test()] + public void AddLiteDatabaseTest_WithPatch() + { + + using (var provider = new ServiceCollection() + .AddLiteDatabase(configure => + { + configure.ConnectionString.Filename = ConnectionString; + configure.AddDatabasePatch(action => { action.UserVersion= 1; }); + }) + .BuildServiceProvider()) + { + LiteDatabase database = null; + Assert.DoesNotThrow(() => database = provider.GetRequiredService()); + Assert.That(database.UserVersion, Is.EqualTo(1)); + } + } + + [Test()] + public void AddLiteDatabaseTest_WithPatchExceptionThrows() + { + + using (var provider = new ServiceCollection() + .AddLiteDatabase(configure => + { + configure.ConnectionString.Filename = ConnectionString; + configure.AddDatabasePatch(action => { throw new Exception(); }); + }) + .BuildServiceProvider()) + { + LiteDatabase database = null; + Assert.Throws(() => database = provider.GetRequiredService()); + } + } + [Test()] public void AddLiteDatabaseTest_WithConfigure_SupportsLogging() { diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection/AleRoe.LiteDB.Extensions.DependencyInjection.csproj b/src/AleRoe.LiteDB.Extensions.DependencyInjection/AleRoe.LiteDB.Extensions.DependencyInjection.csproj index 468869f..a5da45e 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection/AleRoe.LiteDB.Extensions.DependencyInjection.csproj +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection/AleRoe.LiteDB.Extensions.DependencyInjection.csproj @@ -1,12 +1,12 @@ - net6.0;net48 - 0.0.93 + net7.0;net48 + 0.1.0 Alexander Röthinger AleRoe Provides extension methods for registering and customizing a LiteDB.LiteDabase singleton instance using Microsoft.Extensions.DependencyInjection. - Alexander Röthinger, 2021 + Alexander Röthinger, 2022 https://aleroe.github.io/LiteDB.Extensions true C:\Users\Alexander\Source\LocalPackages @@ -14,13 +14,13 @@ MIT true git - 0.0.9.0003 - 0.0.9.0003 + 0.1.0.0000 + 0.1.0.0000 dependency-injection;extension-methods;litedb;microsoft-extensions;litedb-extension - + diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseFactory.cs b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseFactory.cs index 3802d95..6acc038 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseFactory.cs +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using LiteDB; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -32,7 +33,29 @@ public LiteDatabase Create() throw new ArgumentNullException("LiteDB.Database connection string is invalid.", nameof(ConnectionString.Filename)); options.Logger?.LogInformation($"Using database {options.ConnectionString.Filename}"); - return new LiteDatabase(options.ConnectionString, options.Mapper); + var database = new LiteDatabase(options.ConnectionString, options.Mapper); + + if (options.DatabasePatches.Any()) + { + try + { + foreach (var item in options.DatabasePatches) + { + item.Invoke(database); + } + database.Commit(); + } + catch (Exception e) + { + database.Rollback(); + throw new LiteException(e.HResult, e.Message); + } + + } + + + return database; + } } } \ No newline at end of file diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceExtensions.cs b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceExtensions.cs index 873574a..55065f1 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceExtensions.cs +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceExtensions.cs @@ -64,6 +64,7 @@ public static IServiceCollection AddLiteDatabase(this IServiceCollection service { configure.ConnectionString = options.ConnectionString; configure.Mapper = options.Mapper; + options.DatabasePatches.ForEach(x => configure.AddDatabasePatch(x)); if (options.Logger != null) { configure.Logger = options.Logger; diff --git a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceOptions.cs b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceOptions.cs index 3e54aad..ac3cd1d 100644 --- a/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceOptions.cs +++ b/src/AleRoe.LiteDB.Extensions.DependencyInjection/LiteDatabaseServiceOptions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using LiteDB; using Microsoft.Extensions.Logging; @@ -9,6 +10,8 @@ namespace AleRoe.LiteDB.Extensions.DependencyInjection /// public class LiteDatabaseServiceOptions { + + public List> DatabasePatches { get; } = new List>(); /// /// Initializes a new instance of the class. /// @@ -39,5 +42,11 @@ public LiteDatabaseServiceOptions(string connectionString) /// Gets or sets the logger. /// public ILogger Logger { get; set; } + + public LiteDatabaseServiceOptions AddDatabasePatch(Action action) + { + DatabasePatches.Add(action); + return this; + } } } \ No newline at end of file