Browse Source

Refactor.

pull/112/head
Halil İbrahim Kalkan 9 years ago
parent
commit
816823ad54
  1. 28
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextCreationContext.cs
  2. 6
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs
  3. 27
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs
  4. 24
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs

28
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<DbContextCreationContext> _current = new AsyncLocal<DbContextCreationContext>();
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);
}
}
}

6
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs

@ -47,10 +47,10 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection
return scope.ServiceProvider.GetRequiredService<IOptions<AbpDbContextOptions>>().Value;
}
private static DbContextOptionsFactoryContext GetCreationContext<TDbContext>(IServiceProvider serviceProvider)
private static DbContextCreationContext GetCreationContext<TDbContext>(IServiceProvider serviceProvider)
where TDbContext : AbpDbContext<TDbContext>
{
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<TDbContext>();
var connectionString = serviceProvider.GetRequiredService<IConnectionStringResolver>().Resolve(connectionStringName);
return new DbContextOptionsFactoryContext(
return new DbContextCreationContext(
connectionStringName,
connectionString
);

27
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactoryContext.cs

@ -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<DbContextOptionsFactoryContext> _current = new AsyncLocal<DbContextOptionsFactoryContext>();
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);
}
}
}

24
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs

@ -29,18 +29,24 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName<TDbContext>();
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<TDbContext>(
unitOfWork.ServiceProvider.GetRequiredService<TDbContext>()
));
var databaseApi = unitOfWork.GetOrAddDatabaseApi(
dbContextKey,
() => new DbContextDatabaseApi<TDbContext>(
CreateDbContext(unitOfWork, connectionStringName, connectionString)
));
return ((DbContextDatabaseApi<TDbContext>)databaseApi).DbContext;
}
return ((DbContextDatabaseApi<TDbContext>)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<TDbContext>();
}
}
}

Loading…
Cancel
Save