diff --git a/Streetwriters.Data/DbContexts/MongoDbContext.cs b/Streetwriters.Data/DbContexts/MongoDbContext.cs index ee5a11e..ca9de46 100644 --- a/Streetwriters.Data/DbContexts/MongoDbContext.cs +++ b/Streetwriters.Data/DbContexts/MongoDbContext.cs @@ -28,20 +28,26 @@ using System.Threading.Tasks; namespace Streetwriters.Data.DbContexts { - public class MongoDbContext : IDbContext + public class MongoDbContext(IMongoClient MongoClient) : IDbContext { - private IMongoDatabase Database { get; set; } - private MongoClient MongoClient { get; set; } - private readonly List> _commands; - private IDbSettings DbSettings { get; set; } - public MongoDbContext(IDbSettings dbSettings) + public static IMongoClient CreateMongoDbClient(IDbSettings dbSettings) { - DbSettings = dbSettings; - Configure(); - // Every command will be stored and it'll be processed at SaveChanges - _commands = new List>(); + var settings = MongoClientSettings.FromConnectionString(dbSettings.ConnectionString); + settings.MaxConnectionPoolSize = 500; + settings.MinConnectionPoolSize = 0; + return new MongoClient(settings); } + public static IMongoCollection GetMongoCollection(IMongoClient client, string databaseName, string collectionName) + { + return client.GetDatabase(databaseName).GetCollection(collectionName, new MongoCollectionSettings() + { + AssignIdOnInsert = true, + }); + } + + private readonly List> _commands = []; + public async Task SaveChanges() { try @@ -51,7 +57,7 @@ namespace Streetwriters.Data.DbContexts using (IClientSessionHandle session = await MongoClient.StartSessionAsync()) { #if DEBUG - await Task.WhenAll(_commands.Select(c => c(session, default))); + await Parallel.ForEachAsync(_commands, async (c, ct) => await c(session, ct)); #else await session.WithTransactionAsync(async (handle, token) => { @@ -71,26 +77,6 @@ namespace Streetwriters.Data.DbContexts } } - private void Configure() - { - if (MongoClient != null) - { - return; - } - var settings = MongoClientSettings.FromConnectionString(DbSettings.ConnectionString); - settings.MaxConnectionPoolSize = 500; - settings.MinConnectionPoolSize = 0; - MongoClient = new MongoClient(settings); - } - - public IMongoCollection GetCollection(string databaseName, string collectionName) - { - return MongoClient.GetDatabase(databaseName).GetCollection(collectionName, new MongoCollectionSettings() - { - AssignIdOnInsert = true, - }); - } - public void AddCommand(Func func) { _commands.Add(func); @@ -100,10 +86,5 @@ namespace Streetwriters.Data.DbContexts { GC.SuppressFinalize(this); } - - public Task DropDatabaseAsync() - { - return MongoClient.DropDatabaseAsync(DbSettings.DatabaseName); - } } } \ No newline at end of file diff --git a/Streetwriters.Data/Interfaces/IDbContext.cs b/Streetwriters.Data/Interfaces/IDbContext.cs index 2c4830f..cc6393b 100644 --- a/Streetwriters.Data/Interfaces/IDbContext.cs +++ b/Streetwriters.Data/Interfaces/IDbContext.cs @@ -29,6 +29,5 @@ namespace Streetwriters.Data.Interfaces { void AddCommand(Func func); Task SaveChanges(); - IMongoCollection GetCollection(string databaseName, string collectionName); } } \ No newline at end of file diff --git a/Streetwriters.Data/Repositories/Repository.cs b/Streetwriters.Data/Repositories/Repository.cs index 3d4f6f1..246a195 100644 --- a/Streetwriters.Data/Repositories/Repository.cs +++ b/Streetwriters.Data/Repositories/Repository.cs @@ -31,20 +31,14 @@ namespace Streetwriters.Data.Repositories public class Repository where TEntity : class { protected readonly IDbContext dbContext; - protected IMongoCollection Collection { get; set; } + public IMongoCollection Collection { get; set; } - public Repository(IDbContext _dbContext, string databaseName, string collectionName) + public Repository(IDbContext _dbContext, IMongoCollection collection) { dbContext = _dbContext; - Collection = GetCollection(databaseName, collectionName); + Collection = collection; } - private protected IMongoCollection GetCollection(string databaseName, string collectionName) - { - return dbContext.GetCollection(databaseName, collectionName); - } - - public virtual void Insert(TEntity obj) { dbContext.AddCommand((handle, ct) => Collection.InsertOneAsync(handle, obj, null, ct)); diff --git a/Streetwriters.Data/UnitOfWork.cs b/Streetwriters.Data/UnitOfWork.cs index 8d021e3..5075394 100644 --- a/Streetwriters.Data/UnitOfWork.cs +++ b/Streetwriters.Data/UnitOfWork.cs @@ -23,24 +23,16 @@ using Streetwriters.Data.Interfaces; namespace Streetwriters.Data { - public class UnitOfWork : IUnitOfWork + public class UnitOfWork(IDbContext dbContext) : IUnitOfWork { - private readonly IDbContext dbContext; - - public UnitOfWork(IDbContext _dbContext) - { - dbContext = _dbContext; - } - public async Task Commit() { - var changeAmount = await dbContext.SaveChanges(); - return changeAmount > 0; + return await dbContext.SaveChanges() > 0; } public void Dispose() { - this.dbContext.Dispose(); + dbContext.Dispose(); } } } \ No newline at end of file