From 4089a71058ce6754104653dcd9cee789ce1bc955 Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 11:59:51 +0200 Subject: [PATCH 1/9] Add session provider --- src/MongoDB.Extensions.sln | 6 +++ src/Session.Abstractions/ISession.cs | 12 +++++ src/Session.Abstractions/ISessionProvider.cs | 15 ++++++ .../ITransactionSession.cs | 9 ++++ .../Session.Abstractions.csproj | 14 +++++ src/Session/Internal/MongoSession.cs | 52 +++++++++++++++++++ src/Session/Internal/MongoSessionProvider.cs | 51 ++++++++++++++++++ .../Internal/MongoTransactionSession.cs | 45 ++++++++++++++++ src/Session/ServiceCollectionExtensions.cs | 18 +++++++ src/Session/Session.csproj | 5 ++ 10 files changed, 227 insertions(+) create mode 100644 src/Session.Abstractions/ISession.cs create mode 100644 src/Session.Abstractions/ISessionProvider.cs create mode 100644 src/Session.Abstractions/ITransactionSession.cs create mode 100644 src/Session.Abstractions/Session.Abstractions.csproj create mode 100644 src/Session/Internal/MongoSession.cs create mode 100644 src/Session/Internal/MongoSessionProvider.cs create mode 100644 src/Session/Internal/MongoTransactionSession.cs create mode 100644 src/Session/ServiceCollectionExtensions.cs diff --git a/src/MongoDB.Extensions.sln b/src/MongoDB.Extensions.sln index c0258ca..23fc593 100644 --- a/src/MongoDB.Extensions.sln +++ b/src/MongoDB.Extensions.sln @@ -32,6 +32,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".SolutionFiles", ".Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Context.AllowedTypes.Tests", "Context.AllowedTypes.Tests\Context.AllowedTypes.Tests.csproj", "{C59B2068-C3F4-4900-A1CB-7BFD63F94095}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Session.Abstractions", "Session.Abstractions\Session.Abstractions.csproj", "{01DB2766-1419-4518-9C6F-77BF9C670F72}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -86,6 +88,10 @@ Global {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Debug|Any CPU.Build.0 = Debug|Any CPU {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Release|Any CPU.ActiveCfg = Release|Any CPU {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Release|Any CPU.Build.0 = Release|Any CPU + {01DB2766-1419-4518-9C6F-77BF9C670F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01DB2766-1419-4518-9C6F-77BF9C670F72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01DB2766-1419-4518-9C6F-77BF9C670F72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01DB2766-1419-4518-9C6F-77BF9C670F72}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Session.Abstractions/ISession.cs b/src/Session.Abstractions/ISession.cs new file mode 100644 index 0000000..81a7195 --- /dev/null +++ b/src/Session.Abstractions/ISession.cs @@ -0,0 +1,12 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace MongoDB.Extensions.Session; + +public interface ISession : IDisposable +{ + Task WithTransactionAsync( + Func> action, + CancellationToken cancellationToken); +} diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session.Abstractions/ISessionProvider.cs new file mode 100644 index 0000000..2508851 --- /dev/null +++ b/src/Session.Abstractions/ISessionProvider.cs @@ -0,0 +1,15 @@ +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Extensions.Context; + +namespace MongoDB.Extensions.Session; + +public interface ISessionProvider + where TContext : IMongoDbContext +{ + Task BeginTransactionAsync( + CancellationToken cancellationToken); + + Task StartSessionAsync( + CancellationToken cancellationToken); +} diff --git a/src/Session.Abstractions/ITransactionSession.cs b/src/Session.Abstractions/ITransactionSession.cs new file mode 100644 index 0000000..65157d6 --- /dev/null +++ b/src/Session.Abstractions/ITransactionSession.cs @@ -0,0 +1,9 @@ +using System; +using System.Threading.Tasks; + +namespace MongoDB.Extensions.Session; + +public interface ITransactionSession : IDisposable +{ + Task CommitAsync(); +} diff --git a/src/Session.Abstractions/Session.Abstractions.csproj b/src/Session.Abstractions/Session.Abstractions.csproj new file mode 100644 index 0000000..e701d0f --- /dev/null +++ b/src/Session.Abstractions/Session.Abstractions.csproj @@ -0,0 +1,14 @@ + + + + + MongoDB.Extensions.Session.Abstractions + MongoDB.Extensions.Session.Abstractions + MongoDB.Extensions.Session.Abstractions + + + + + + + diff --git a/src/Session/Internal/MongoSession.cs b/src/Session/Internal/MongoSession.cs new file mode 100644 index 0000000..8a25241 --- /dev/null +++ b/src/Session/Internal/MongoSession.cs @@ -0,0 +1,52 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; + +namespace MongoDB.Extensions.Session; + +internal sealed class MongoSession : ISession +{ + private readonly IClientSessionHandle _session; + private bool _disposed; + + private static TransactionOptions TransactionOptions { get; } = new( + ReadConcern.Majority, + ReadPreference.Primary, + WriteConcern.WMajority.With(journal: true), + TimeSpan.FromSeconds(180)); + + public MongoSession(IClientSessionHandle clientSession) + { + _session = clientSession; + } + + public Task WithTransactionAsync( + Func> action, + CancellationToken cancellationToken) + { + return _session.WithTransactionAsync( + (_, ct) => action(this, ct), + TransactionOptions, + cancellationToken); + } + + private void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + _session.Dispose(); + } + + _disposed = true; + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } +} diff --git a/src/Session/Internal/MongoSessionProvider.cs b/src/Session/Internal/MongoSessionProvider.cs new file mode 100644 index 0000000..407fc8f --- /dev/null +++ b/src/Session/Internal/MongoSessionProvider.cs @@ -0,0 +1,51 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Extensions.Context; + +namespace MongoDB.Extensions.Session; + +internal class MongoSessionProvider : ISessionProvider + where TContext : IMongoDbContext +{ + private readonly IMongoClient _mongoClient; + + public MongoSessionProvider(TContext context) + { + _mongoClient = context.Client; + } + + public Task BeginTransactionAsync( + CancellationToken cancellationToken) + { + return BeginTransactionAsync(true, cancellationToken); + } + + private async Task BeginTransactionAsync( + bool safeModeEnabled, + CancellationToken cancellationToken) + { + IClientSessionHandle clientSession = await _mongoClient + .StartSessionAsync(cancellationToken: cancellationToken); + + var transactionOptions = new TransactionOptions( + ReadConcern.Majority, + ReadPreference.Primary, + WriteConcern.WMajority.With(journal: safeModeEnabled), + TimeSpan.FromSeconds(180)); + + clientSession.StartTransaction(transactionOptions); + + return new MongoTransactionSession(clientSession, cancellationToken); + } + + public async Task StartSessionAsync( + CancellationToken cancellationToken) + { + IClientSessionHandle clientSession = await _mongoClient + .StartSessionAsync(cancellationToken: cancellationToken); + + return new MongoSession(clientSession); + } +} diff --git a/src/Session/Internal/MongoTransactionSession.cs b/src/Session/Internal/MongoTransactionSession.cs new file mode 100644 index 0000000..c27e1da --- /dev/null +++ b/src/Session/Internal/MongoTransactionSession.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; + +namespace MongoDB.Extensions.Session; + +internal class MongoTransactionSession : ITransactionSession +{ + private readonly IClientSessionHandle _session; + private readonly CancellationToken _cancellationToken; + private bool _disposed; + + public MongoTransactionSession( + IClientSessionHandle clientSession, + CancellationToken cancellationToken) + { + _session = clientSession; + _cancellationToken = cancellationToken; + } + + public async Task CommitAsync() + { + await _session.CommitTransactionAsync(_cancellationToken); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + _session.Dispose(); + } + + _disposed = true; + } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } +} diff --git a/src/Session/ServiceCollectionExtensions.cs b/src/Session/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..8c78a26 --- /dev/null +++ b/src/Session/ServiceCollectionExtensions.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using MongoDB.Extensions.Context; + +namespace MongoDB.Extensions.Session; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddMongoSessionProvider( + this IServiceCollection services) + where TContext : class, IMongoDbContext + { + services.TryAddSingleton(); + services.TryAddSingleton, MongoSessionProvider>(); + + return services; + } +} diff --git a/src/Session/Session.csproj b/src/Session/Session.csproj index 02b41b9..344477f 100644 --- a/src/Session/Session.csproj +++ b/src/Session/Session.csproj @@ -9,6 +9,11 @@ + + + + + From 361f56bb198f0ce3a29d52d71c2ebee963be1b7d Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 14:11:13 +0200 Subject: [PATCH 2/9] Add tests --- .../MongoSessionProviderTests.cs | 138 ++++++++++++++++++ src/Session/Internal/MongoSession.cs | 9 +- .../Internal/MongoTransactionSession.cs | 9 +- src/Session/TransactionSessionExtensions.cs | 31 ++++ 4 files changed, 179 insertions(+), 8 deletions(-) create mode 100644 src/Session.Tests/MongoSessionProviderTests.cs create mode 100644 src/Session/TransactionSessionExtensions.cs diff --git a/src/Session.Tests/MongoSessionProviderTests.cs b/src/Session.Tests/MongoSessionProviderTests.cs new file mode 100644 index 0000000..5599b17 --- /dev/null +++ b/src/Session.Tests/MongoSessionProviderTests.cs @@ -0,0 +1,138 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Extensions.Context; +using Squadron; +using Xunit; + +namespace MongoDB.Extensions.Session.Tests; + +public class MongoSessionProviderTests : IClassFixture +{ + private readonly IServiceProvider _serviceProvider; + + public MongoSessionProviderTests(MongoReplicaSetResource mongoResource) + { + var mongoOptions = new MongoOptions + { + ConnectionString = mongoResource.ConnectionString, + DatabaseName = mongoResource.CreateDatabase().DatabaseNamespace.DatabaseName + }; + + _serviceProvider = new ServiceCollection() + .AddSingleton(mongoOptions) + .AddMongoSessionProvider() + .BuildServiceProvider(); + } + + [Fact] + public async Task BeginTransactionAsync_ShouldBeginTransaction() + { + // Arrange + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); + + // Act + ITransactionSession transactionSession = await sessionProvider + .BeginTransactionAsync(CancellationToken.None); + + // Assert + transactionSession.Should().NotBeNull(); + IClientSessionHandle clientSessionHandle = transactionSession.GetSessionHandle(); + clientSessionHandle.ServerSession.Id["id"].AsGuid.Should().NotBeEmpty(); + clientSessionHandle.IsInTransaction.Should().BeTrue(); + } + + [Fact] + public async Task StartSessionAsync_ShouldStartSession() + { + // Arrange + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); + + // Act + ISession session = await sessionProvider + .StartSessionAsync(CancellationToken.None); + + // Assert + session.Should().NotBeNull(); + IClientSessionHandle clientSessionHandle = session.GetSessionHandle(); + clientSessionHandle.ServerSession.Id["id"].AsGuid.Should().NotBeEmpty(); + clientSessionHandle.IsInTransaction.Should().BeFalse(); + } + + [Fact] + public async Task MongoSession_Dispose_ShouldDisposeSession() + { + // Arrange + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); + + ISession session = await sessionProvider + .StartSessionAsync(CancellationToken.None); + + // Act + session.Dispose(); + + // Assert + IClientSessionHandle clientSessionHandle = session.GetSessionHandle(); + Assert.Throws(() => clientSessionHandle.ServerSession); + } + + [Fact] + public async Task MongoTransactionSession_Dispose_ShouldDisposeSession() + { + // Arrange + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); + + ITransactionSession transactionSession = await sessionProvider + .BeginTransactionAsync(CancellationToken.None); + + // Act + transactionSession.Dispose(); + + // Assert + IClientSessionHandle clientSessionHandle = transactionSession.GetSessionHandle(); + Assert.Throws(() => clientSessionHandle.ServerSession); + } + + [Fact] + public async Task MongoTransactionSession_NotCommitting_ShouldNotAffectDatabase() + { + // Arrange + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); + + ITransactionSession transactionSession = await sessionProvider + .BeginTransactionAsync(CancellationToken.None); + TestDbContext context = _serviceProvider.GetRequiredService(); + IMongoCollection collection = context.CreateCollection(); + await collection.InsertOneAsync(transactionSession.GetSessionHandle(), new BsonDocument()); + + // Act + // Not committing the transaction + + // Assert + (await collection + .Find(FilterDefinition.Empty) + .ToListAsync()) + .Count.Should().Be(0); + } + + private class TestDbContext : MongoDbContext + { + public TestDbContext(MongoOptions mongoOptions) + : base(mongoOptions) + { + } + + protected override void OnConfiguring(IMongoDatabaseBuilder mongoDatabaseBuilder) + { + } + } +} diff --git a/src/Session/Internal/MongoSession.cs b/src/Session/Internal/MongoSession.cs index 8a25241..e149d63 100644 --- a/src/Session/Internal/MongoSession.cs +++ b/src/Session/Internal/MongoSession.cs @@ -7,7 +7,6 @@ namespace MongoDB.Extensions.Session; internal sealed class MongoSession : ISession { - private readonly IClientSessionHandle _session; private bool _disposed; private static TransactionOptions TransactionOptions { get; } = new( @@ -18,14 +17,16 @@ internal sealed class MongoSession : ISession public MongoSession(IClientSessionHandle clientSession) { - _session = clientSession; + Session = clientSession; } + public IClientSessionHandle Session { get; } + public Task WithTransactionAsync( Func> action, CancellationToken cancellationToken) { - return _session.WithTransactionAsync( + return Session.WithTransactionAsync( (_, ct) => action(this, ct), TransactionOptions, cancellationToken); @@ -37,7 +38,7 @@ private void Dispose(bool disposing) { if (disposing) { - _session.Dispose(); + Session.Dispose(); } _disposed = true; diff --git a/src/Session/Internal/MongoTransactionSession.cs b/src/Session/Internal/MongoTransactionSession.cs index c27e1da..9835aa7 100644 --- a/src/Session/Internal/MongoTransactionSession.cs +++ b/src/Session/Internal/MongoTransactionSession.cs @@ -7,7 +7,6 @@ namespace MongoDB.Extensions.Session; internal class MongoTransactionSession : ITransactionSession { - private readonly IClientSessionHandle _session; private readonly CancellationToken _cancellationToken; private bool _disposed; @@ -15,13 +14,15 @@ internal class MongoTransactionSession : ITransactionSession IClientSessionHandle clientSession, CancellationToken cancellationToken) { - _session = clientSession; + Session = clientSession; _cancellationToken = cancellationToken; } + public IClientSessionHandle Session { get; } + public async Task CommitAsync() { - await _session.CommitTransactionAsync(_cancellationToken); + await Session.CommitTransactionAsync(_cancellationToken); } protected virtual void Dispose(bool disposing) @@ -30,7 +31,7 @@ protected virtual void Dispose(bool disposing) { if (disposing) { - _session.Dispose(); + Session.Dispose(); } _disposed = true; diff --git a/src/Session/TransactionSessionExtensions.cs b/src/Session/TransactionSessionExtensions.cs new file mode 100644 index 0000000..97d7eb3 --- /dev/null +++ b/src/Session/TransactionSessionExtensions.cs @@ -0,0 +1,31 @@ +using System; +using MongoDB.Driver; + +namespace MongoDB.Extensions.Session; + +public static class TransactionSessionExtensions +{ + public static IClientSessionHandle GetSessionHandle( + this ITransactionSession session) + { + if (session is MongoTransactionSession mongoTransactionSession) + { + return mongoTransactionSession.Session; + } + + throw new InvalidOperationException( + $"Unknown session type {session.GetType().Name}"); + } + + public static IClientSessionHandle GetSessionHandle( + this ISession session) + { + if (session is MongoSession mongoSession) + { + return mongoSession.Session; + } + + throw new InvalidOperationException( + $"Unknown session type {session.GetType().Name}"); + } +} From 38bf08b27b3625e16d398cd73a43942d674de968 Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 14:19:56 +0200 Subject: [PATCH 3/9] Fix build link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b20eec..756cbd9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## [![Nuget](https://img.shields.io/nuget/v/MongoDB.Extensions.Context.svg?style=flat)](https://www.nuget.org/packages/MongoDB.Extensions.Context) [![GitHub Release](https://img.shields.io/github/release/SwissLife-OSS/mongo-extensions.svg?style=flat)](https://github.com/SwissLife-OSS/Mongo-extensions/releases/latest) [![Build Status](https://dev.azure.com/swisslife-oss/swisslife-oss/_apis/build/status/MongoDB.Extensions.Release?branchName=master)](https://dev.azure.com/swisslife-oss/swisslife-oss/_build/latest?definitionId=11&branchName=master) +## [![Nuget](https://img.shields.io/nuget/v/MongoDB.Extensions.Context.svg?style=flat)](https://www.nuget.org/packages/MongoDB.Extensions.Context) [![GitHub Release](https://img.shields.io/github/release/SwissLife-OSS/mongo-extensions.svg?style=flat)](https://github.com/SwissLife-OSS/Mongo-extensions/releases/latest) [![Build Status](https://github.com/SwissLife-OSS/mongo-extensions/actions/workflows/release.yml/badge.svg)](https://github.com/SwissLife-OSS/mongo-extensions/actions/workflows/release.yml) **MongoDB.Extensions provides a set of utility libraries for MongoDB.** From a45dc0d1edbb740e4df5449de7a3b0526cfa8a55 Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 14:43:20 +0200 Subject: [PATCH 4/9] Change namespace --- src/Session.Abstractions/ISession.cs | 2 +- src/Session.Abstractions/ISessionProvider.cs | 2 +- src/Session.Abstractions/ITransactionSession.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Session.Abstractions/ISession.cs b/src/Session.Abstractions/ISession.cs index 81a7195..3d68b42 100644 --- a/src/Session.Abstractions/ISession.cs +++ b/src/Session.Abstractions/ISession.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MongoDB.Extensions.Session; +namespace MongoDB.Extensions.Session.Abstractions; public interface ISession : IDisposable { diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session.Abstractions/ISessionProvider.cs index 2508851..c600fea 100644 --- a/src/Session.Abstractions/ISessionProvider.cs +++ b/src/Session.Abstractions/ISessionProvider.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using MongoDB.Extensions.Context; -namespace MongoDB.Extensions.Session; +namespace MongoDB.Extensions.Session.Abstractions; public interface ISessionProvider where TContext : IMongoDbContext diff --git a/src/Session.Abstractions/ITransactionSession.cs b/src/Session.Abstractions/ITransactionSession.cs index 65157d6..bbff96a 100644 --- a/src/Session.Abstractions/ITransactionSession.cs +++ b/src/Session.Abstractions/ITransactionSession.cs @@ -1,7 +1,7 @@ using System; using System.Threading.Tasks; -namespace MongoDB.Extensions.Session; +namespace MongoDB.Extensions.Session.Abstractions; public interface ITransactionSession : IDisposable { From 3e32e0bd5668da91ac7b8124692d87c7b9a4a68d Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 14:54:37 +0200 Subject: [PATCH 5/9] Revert custom namespace for abstractions --- src/Session.Abstractions/ISession.cs | 2 +- src/Session.Abstractions/ISessionProvider.cs | 2 +- src/Session.Abstractions/ITransactionSession.cs | 2 +- src/Session.Abstractions/Session.Abstractions.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Session.Abstractions/ISession.cs b/src/Session.Abstractions/ISession.cs index 3d68b42..81a7195 100644 --- a/src/Session.Abstractions/ISession.cs +++ b/src/Session.Abstractions/ISession.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; -namespace MongoDB.Extensions.Session.Abstractions; +namespace MongoDB.Extensions.Session; public interface ISession : IDisposable { diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session.Abstractions/ISessionProvider.cs index c600fea..2508851 100644 --- a/src/Session.Abstractions/ISessionProvider.cs +++ b/src/Session.Abstractions/ISessionProvider.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using MongoDB.Extensions.Context; -namespace MongoDB.Extensions.Session.Abstractions; +namespace MongoDB.Extensions.Session; public interface ISessionProvider where TContext : IMongoDbContext diff --git a/src/Session.Abstractions/ITransactionSession.cs b/src/Session.Abstractions/ITransactionSession.cs index bbff96a..65157d6 100644 --- a/src/Session.Abstractions/ITransactionSession.cs +++ b/src/Session.Abstractions/ITransactionSession.cs @@ -1,7 +1,7 @@ using System; using System.Threading.Tasks; -namespace MongoDB.Extensions.Session.Abstractions; +namespace MongoDB.Extensions.Session; public interface ITransactionSession : IDisposable { diff --git a/src/Session.Abstractions/Session.Abstractions.csproj b/src/Session.Abstractions/Session.Abstractions.csproj index e701d0f..376cf02 100644 --- a/src/Session.Abstractions/Session.Abstractions.csproj +++ b/src/Session.Abstractions/Session.Abstractions.csproj @@ -3,7 +3,7 @@ MongoDB.Extensions.Session.Abstractions - MongoDB.Extensions.Session.Abstractions + MongoDB.Extensions.Session MongoDB.Extensions.Session.Abstractions From b8b2ea34f65653bb85701d113b95e1717a90236d Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 16:33:55 +0200 Subject: [PATCH 6/9] Fix session scope --- src/Session.Abstractions/ISessionProvider.cs | 8 +++--- .../MongoSessionProviderTests.cs | 26 +++++++++++-------- src/Session/Internal/MongoSessionProvider.cs | 2 +- src/Session/ServiceCollectionExtensions.cs | 4 +-- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session.Abstractions/ISessionProvider.cs index 2508851..326af9a 100644 --- a/src/Session.Abstractions/ISessionProvider.cs +++ b/src/Session.Abstractions/ISessionProvider.cs @@ -1,11 +1,9 @@ using System.Threading; using System.Threading.Tasks; -using MongoDB.Extensions.Context; namespace MongoDB.Extensions.Session; -public interface ISessionProvider - where TContext : IMongoDbContext +public interface ISessionProvider { Task BeginTransactionAsync( CancellationToken cancellationToken); @@ -13,3 +11,7 @@ public interface ISessionProvider Task StartSessionAsync( CancellationToken cancellationToken); } + +public interface ISessionProvider : ISessionProvider +{ +} diff --git a/src/Session.Tests/MongoSessionProviderTests.cs b/src/Session.Tests/MongoSessionProviderTests.cs index 5599b17..4a0aa0d 100644 --- a/src/Session.Tests/MongoSessionProviderTests.cs +++ b/src/Session.Tests/MongoSessionProviderTests.cs @@ -25,7 +25,7 @@ public MongoSessionProviderTests(MongoReplicaSetResource mongoResource) _serviceProvider = new ServiceCollection() .AddSingleton(mongoOptions) - .AddMongoSessionProvider() + .AddMongoSessionProvider() .BuildServiceProvider(); } @@ -33,8 +33,8 @@ public MongoSessionProviderTests(MongoReplicaSetResource mongoResource) public async Task BeginTransactionAsync_ShouldBeginTransaction() { // Arrange - ISessionProvider sessionProvider = _serviceProvider - .GetRequiredService>(); + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); // Act ITransactionSession transactionSession = await sessionProvider @@ -51,8 +51,8 @@ public async Task BeginTransactionAsync_ShouldBeginTransaction() public async Task StartSessionAsync_ShouldStartSession() { // Arrange - ISessionProvider sessionProvider = _serviceProvider - .GetRequiredService>(); + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); // Act ISession session = await sessionProvider @@ -69,8 +69,8 @@ public async Task StartSessionAsync_ShouldStartSession() public async Task MongoSession_Dispose_ShouldDisposeSession() { // Arrange - ISessionProvider sessionProvider = _serviceProvider - .GetRequiredService>(); + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); ISession session = await sessionProvider .StartSessionAsync(CancellationToken.None); @@ -87,8 +87,8 @@ public async Task MongoSession_Dispose_ShouldDisposeSession() public async Task MongoTransactionSession_Dispose_ShouldDisposeSession() { // Arrange - ISessionProvider sessionProvider = _serviceProvider - .GetRequiredService>(); + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); ITransactionSession transactionSession = await sessionProvider .BeginTransactionAsync(CancellationToken.None); @@ -105,8 +105,8 @@ public async Task MongoTransactionSession_Dispose_ShouldDisposeSession() public async Task MongoTransactionSession_NotCommitting_ShouldNotAffectDatabase() { // Arrange - ISessionProvider sessionProvider = _serviceProvider - .GetRequiredService>(); + ISessionProvider sessionProvider = _serviceProvider + .GetRequiredService>(); ITransactionSession transactionSession = await sessionProvider .BeginTransactionAsync(CancellationToken.None); @@ -135,4 +135,8 @@ protected override void OnConfiguring(IMongoDatabaseBuilder mongoDatabaseBuilder { } } + + private interface ITestScope + { + } } diff --git a/src/Session/Internal/MongoSessionProvider.cs b/src/Session/Internal/MongoSessionProvider.cs index 407fc8f..5b148d6 100644 --- a/src/Session/Internal/MongoSessionProvider.cs +++ b/src/Session/Internal/MongoSessionProvider.cs @@ -6,7 +6,7 @@ namespace MongoDB.Extensions.Session; -internal class MongoSessionProvider : ISessionProvider +internal class MongoSessionProvider : ISessionProvider where TContext : IMongoDbContext { private readonly IMongoClient _mongoClient; diff --git a/src/Session/ServiceCollectionExtensions.cs b/src/Session/ServiceCollectionExtensions.cs index 8c78a26..2ce6a3e 100644 --- a/src/Session/ServiceCollectionExtensions.cs +++ b/src/Session/ServiceCollectionExtensions.cs @@ -6,12 +6,12 @@ namespace MongoDB.Extensions.Session; public static class ServiceCollectionExtensions { - public static IServiceCollection AddMongoSessionProvider( + public static IServiceCollection AddMongoSessionProvider( this IServiceCollection services) where TContext : class, IMongoDbContext { services.TryAddSingleton(); - services.TryAddSingleton, MongoSessionProvider>(); + services.TryAddSingleton, MongoSessionProvider>(); return services; } From 889cb9603a470fdd9067b69f929380eb6d93e3cb Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 17:35:10 +0200 Subject: [PATCH 7/9] Remove the session provider without scope --- src/Session.Abstractions/ISessionProvider.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session.Abstractions/ISessionProvider.cs index 326af9a..d4f9bcb 100644 --- a/src/Session.Abstractions/ISessionProvider.cs +++ b/src/Session.Abstractions/ISessionProvider.cs @@ -3,7 +3,7 @@ namespace MongoDB.Extensions.Session; -public interface ISessionProvider +public interface ISessionProvider { Task BeginTransactionAsync( CancellationToken cancellationToken); @@ -11,7 +11,3 @@ public interface ISessionProvider Task StartSessionAsync( CancellationToken cancellationToken); } - -public interface ISessionProvider : ISessionProvider -{ -} From da9c80088f80d6363c485e99664eeb65c43602e4 Mon Sep 17 00:00:00 2001 From: glucaci Date: Mon, 2 Oct 2023 17:50:09 +0200 Subject: [PATCH 8/9] Make implementation public --- src/Session/Internal/MongoSessionProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Session/Internal/MongoSessionProvider.cs b/src/Session/Internal/MongoSessionProvider.cs index 5b148d6..e12d049 100644 --- a/src/Session/Internal/MongoSessionProvider.cs +++ b/src/Session/Internal/MongoSessionProvider.cs @@ -6,7 +6,7 @@ namespace MongoDB.Extensions.Session; -internal class MongoSessionProvider : ISessionProvider +public class MongoSessionProvider : ISessionProvider where TContext : IMongoDbContext { private readonly IMongoClient _mongoClient; From 3ba7ca00ff8f4fc897c6b2895aa425632fc782f1 Mon Sep 17 00:00:00 2001 From: Normen Scheiber Date: Fri, 19 Jan 2024 12:17:20 +0100 Subject: [PATCH 9/9] session abstraction included to session. --- src/MongoDB.Extensions.sln | 6 ------ .../Session.Abstractions.csproj | 14 -------------- src/{Session.Abstractions => Session}/ISession.cs | 0 .../ISessionProvider.cs | 0 .../ITransactionSession.cs | 0 src/Session/Session.csproj | 2 +- 6 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 src/Session.Abstractions/Session.Abstractions.csproj rename src/{Session.Abstractions => Session}/ISession.cs (100%) rename src/{Session.Abstractions => Session}/ISessionProvider.cs (100%) rename src/{Session.Abstractions => Session}/ITransactionSession.cs (100%) diff --git a/src/MongoDB.Extensions.sln b/src/MongoDB.Extensions.sln index 23fc593..c0258ca 100644 --- a/src/MongoDB.Extensions.sln +++ b/src/MongoDB.Extensions.sln @@ -32,8 +32,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".SolutionFiles", ".Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Context.AllowedTypes.Tests", "Context.AllowedTypes.Tests\Context.AllowedTypes.Tests.csproj", "{C59B2068-C3F4-4900-A1CB-7BFD63F94095}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Session.Abstractions", "Session.Abstractions\Session.Abstractions.csproj", "{01DB2766-1419-4518-9C6F-77BF9C670F72}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -88,10 +86,6 @@ Global {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Debug|Any CPU.Build.0 = Debug|Any CPU {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Release|Any CPU.ActiveCfg = Release|Any CPU {C59B2068-C3F4-4900-A1CB-7BFD63F94095}.Release|Any CPU.Build.0 = Release|Any CPU - {01DB2766-1419-4518-9C6F-77BF9C670F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01DB2766-1419-4518-9C6F-77BF9C670F72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01DB2766-1419-4518-9C6F-77BF9C670F72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01DB2766-1419-4518-9C6F-77BF9C670F72}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Session.Abstractions/Session.Abstractions.csproj b/src/Session.Abstractions/Session.Abstractions.csproj deleted file mode 100644 index 376cf02..0000000 --- a/src/Session.Abstractions/Session.Abstractions.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - - MongoDB.Extensions.Session.Abstractions - MongoDB.Extensions.Session - MongoDB.Extensions.Session.Abstractions - - - - - - - diff --git a/src/Session.Abstractions/ISession.cs b/src/Session/ISession.cs similarity index 100% rename from src/Session.Abstractions/ISession.cs rename to src/Session/ISession.cs diff --git a/src/Session.Abstractions/ISessionProvider.cs b/src/Session/ISessionProvider.cs similarity index 100% rename from src/Session.Abstractions/ISessionProvider.cs rename to src/Session/ISessionProvider.cs diff --git a/src/Session.Abstractions/ITransactionSession.cs b/src/Session/ITransactionSession.cs similarity index 100% rename from src/Session.Abstractions/ITransactionSession.cs rename to src/Session/ITransactionSession.cs diff --git a/src/Session/Session.csproj b/src/Session/Session.csproj index 344477f..503059f 100644 --- a/src/Session/Session.csproj +++ b/src/Session/Session.csproj @@ -13,7 +13,7 @@ - +