From 816823ad542493421cbe1fc073aa229e2578522f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 Sep 2017 15:55:20 +0300 Subject: [PATCH] Refactor. --- .../DbContextCreationContext.cs | 28 +++++++++++++++++++ .../DbContextOptionsFactory.cs | 6 ++-- .../DbContextOptionsFactoryContext.cs | 27 ------------------ .../UnitOfWorkDbContextProvider.cs | 24 ++++++++++------ 4 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextCreationContext.cs delete mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextCreationContext.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextCreationContext.cs new file mode 100644 index 0000000000..b8a713c8aa --- /dev/null +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextCreationContext.cs @@ -0,0 +1,28 @@ +using System; +using System.Threading; + +namespace Volo.Abp.EntityFrameworkCore.DependencyInjection +{ + internal class DbContextCreationContext + { + public static DbContextCreationContext Current => _current.Value; + private static readonly AsyncLocal _current = new AsyncLocal(); + + public string ConnectionStringName { get; } + + public string ConnectionString { get; } + + public DbContextCreationContext(string connectionStringName, string connectionString) + { + ConnectionStringName = connectionStringName; + ConnectionString = connectionString; + } + + public static IDisposable Use(DbContextCreationContext context) + { + var previousValue = Current; + _current.Value = context; + return new DisposeAction(() => _current.Value = previousValue); + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs index 187c56bc21..047c10ba6c 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs @@ -47,10 +47,10 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection return scope.ServiceProvider.GetRequiredService>().Value; } - private static DbContextOptionsFactoryContext GetCreationContext(IServiceProvider serviceProvider) + private static DbContextCreationContext GetCreationContext(IServiceProvider serviceProvider) where TDbContext : AbpDbContext { - var context = DbContextOptionsFactoryContext.Current; + var context = DbContextCreationContext.Current; if (context != null) { return context; @@ -59,7 +59,7 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); var connectionString = serviceProvider.GetRequiredService().Resolve(connectionStringName); - return new DbContextOptionsFactoryContext( + return new DbContextCreationContext( connectionStringName, connectionString ); diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs deleted file mode 100644 index 936d685bc1..0000000000 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Threading; - -namespace Volo.Abp.EntityFrameworkCore.DependencyInjection -{ - internal class DbContextOptionsFactoryContext - { - public static DbContextOptionsFactoryContext Current => _current.Value; - private static readonly AsyncLocal _current = new AsyncLocal(); - - public string ConnectionStringName { get; } - - public string ConnectionString { get; } - - public DbContextOptionsFactoryContext(string connectionStringName, string connectionString) - { - ConnectionStringName = connectionStringName; - ConnectionString = connectionString; - } - - public static IDisposable Use(DbContextOptionsFactoryContext context) - { - _current.Value = context; - return new DisposeAction(() => _current.Value = null); - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index bfa43617b5..717a68ebe7 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs @@ -29,18 +29,24 @@ namespace Volo.Abp.Uow.EntityFrameworkCore var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); var connectionString = _connectionStringResolver.Resolve(connectionStringName); - + var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}"; - using (DbContextOptionsFactoryContext.Use(new DbContextOptionsFactoryContext(connectionStringName, connectionString))) - { - var databaseApi = unitOfWork.GetOrAddDatabaseApi( - dbContextKey, - () => new DbContextDatabaseApi( - unitOfWork.ServiceProvider.GetRequiredService() - )); + var databaseApi = unitOfWork.GetOrAddDatabaseApi( + dbContextKey, + () => new DbContextDatabaseApi( + CreateDbContext(unitOfWork, connectionStringName, connectionString) + )); + + return ((DbContextDatabaseApi)databaseApi).DbContext; + } - return ((DbContextDatabaseApi)databaseApi).DbContext; + private static TDbContext CreateDbContext(IUnitOfWork unitOfWork, string connectionStringName, string connectionString) + { + var creationContext = new DbContextCreationContext(connectionStringName, connectionString); + using (DbContextCreationContext.Use(creationContext)) + { + return unitOfWork.ServiceProvider.GetRequiredService(); } } }