Skip to content

Commit 4a050cf

Browse files
committed
添加dbcontextbuildercreator的接口依赖支持替换,支持添加executordbcontext的applicationserivceprovider的注入
1 parent f093065 commit 4a050cf

File tree

10 files changed

+62
-14
lines changed

10 files changed

+62
-14
lines changed

samples/Sample.AutoCreateIfPresent/DefaultDbContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
22
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.EntityFrameworkCore.Infrastructure;
4+
using ShardingCore.Core.RuntimeContexts;
35
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
46
using ShardingCore.Sharding;
57
using ShardingCore.Sharding.Abstractions;
@@ -24,6 +26,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
2426
base.OnModelCreating(modelBuilder);
2527
modelBuilder.ApplyConfiguration(new OrderByHourMap());
2628
modelBuilder.ApplyConfiguration(new AreaDeviceMap());
29+
Console.WriteLine(this.IsExecutor);
2730
}
2831

2932
public IRouteTail RouteTail { get; set; }
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore;
3+
using ShardingCore.Core.DbContextTypeAwares;
4+
using ShardingCore.Core.ServiceProviders;
5+
6+
namespace ShardingCore.Core.DbContextOptionBuilderCreator
7+
{
8+
public class ActivatorDbContextOptionBuilderCreator:IDbContextOptionBuilderCreator
9+
{
10+
private readonly IShardingProvider _shardingProvider;
11+
private readonly IDbContextTypeAware _dbContextTypeAware;
12+
13+
public ActivatorDbContextOptionBuilderCreator(IShardingProvider shardingProvider,IDbContextTypeAware dbContextTypeAware)
14+
{
15+
_shardingProvider = shardingProvider;
16+
_dbContextTypeAware = dbContextTypeAware;
17+
}
18+
public DbContextOptionsBuilder CreateDbContextOptionBuilder()
19+
{
20+
var dbContextType = _dbContextTypeAware.GetContextType();
21+
Type type = typeof(DbContextOptionsBuilder<>);
22+
type = type.MakeGenericType(dbContextType);
23+
var dbContextOptionsBuilder = (DbContextOptionsBuilder)Activator.CreateInstance(type);
24+
if (_shardingProvider.ApplicationServiceProvider != null)
25+
{
26+
dbContextOptionsBuilder.UseApplicationServiceProvider(_shardingProvider.ApplicationServiceProvider);
27+
}
28+
return dbContextOptionsBuilder;
29+
}
30+
}
31+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.EntityFrameworkCore;
2+
3+
namespace ShardingCore.Core.DbContextOptionBuilderCreator
4+
{
5+
public interface IDbContextOptionBuilderCreator
6+
{
7+
DbContextOptionsBuilder CreateDbContextOptionBuilder();
8+
}
9+
}

src/ShardingCore/Core/RuntimeContexts/IShardingRuntimeContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.EntityFrameworkCore;
33
using Microsoft.Extensions.Logging;
44
using ShardingCore.Core.DbContextCreator;
5+
using ShardingCore.Core.DbContextOptionBuilderCreator;
56
using ShardingCore.Core.DbContextTypeAwares;
67
using ShardingCore.Core.EntityMetadatas;
78
using ShardingCore.Core.QueryRouteManagers.Abstractions;
@@ -31,6 +32,7 @@ public interface IShardingRuntimeContext
3132
Type DbContextType { get; }
3233
IDbContextTypeAware GetDbContextTypeAware();
3334
IShardingProvider GetShardingProvider();
35+
IDbContextOptionBuilderCreator GetDbContextOptionBuilderCreator();
3436
ShardingConfigOptions GetShardingConfigOptions();
3537
IShardingRouteConfigOptions GetShardingRouteConfigOptions();
3638
IShardingMigrationManager GetShardingMigrationManager();

src/ShardingCore/Core/RuntimeContexts/ShardingRuntimeContext.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.Extensions.Logging;
55
using ShardingCore.Bootstrappers;
66
using ShardingCore.Core.DbContextCreator;
7+
using ShardingCore.Core.DbContextOptionBuilderCreator;
78
using ShardingCore.Core.DbContextTypeAwares;
89
using ShardingCore.Core.EntityMetadatas;
910
using ShardingCore.Core.QueryRouteManagers.Abstractions;
@@ -87,6 +88,12 @@ public IShardingProvider GetShardingProvider()
8788
return _shardingProvider??=GetRequiredService<IShardingProvider>();
8889
}
8990

91+
private IDbContextOptionBuilderCreator _dbContextOptionBuilderCreator;
92+
public IDbContextOptionBuilderCreator GetDbContextOptionBuilderCreator()
93+
{
94+
return _dbContextOptionBuilderCreator??=GetRequiredService<IDbContextOptionBuilderCreator>();
95+
}
96+
9097
private ShardingConfigOptions _shardingConfigOptions;
9198
public ShardingConfigOptions GetShardingConfigOptions()
9299
{
@@ -323,6 +330,7 @@ private void InitFieldValue()
323330
{
324331
GetDbContextTypeAware();
325332
GetShardingProvider();
333+
GetDbContextOptionBuilderCreator();
326334
GetShardingConfigOptions();
327335
GetShardingRouteConfigOptions();
328336
GetShardingMigrationManager();

src/ShardingCore/EFCores/AbstractScriptMigrationGenerator.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ private string ExecuteMigrateUnits(IShardingRuntimeContext shardingRuntimeContex
8080
shardingMigrationManager.Current.CurrentDataSourceName = migrateUnit.DataSourceName;
8181

8282
var dbContextOptions = DynamicShardingHelper.CreateShellDbContextOptions(shardingRuntimeContext,
83-
migrateUnit.ShellDbContext.GetType(),
8483
migrateUnit.DataSourceName);
8584

8685
using (var dbContext = dbContextCreator.CreateDbContext(migrateUnit.ShellDbContext,

src/ShardingCore/Helpers/DynamicShardingHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public static async Task DynamicMigrateWithDataSourcesAsync(IShardingRuntimeCont
101101
{
102102
shardingMigrationManager.Current.CurrentDataSourceName = migrateUnit.DataSourceName;
103103

104-
var dbContextOptions = CreateShellDbContextOptions(shardingRuntimeContext,migrateUnit.ShellDbContext.GetType(),
104+
var dbContextOptions = CreateShellDbContextOptions(shardingRuntimeContext,
105105
migrateUnit.DataSourceName);
106106

107107
using (var dbContext = dbContextCreator.CreateDbContext(migrateUnit.ShellDbContext,
@@ -123,11 +123,11 @@ public static async Task DynamicMigrateWithDataSourcesAsync(IShardingRuntimeCont
123123
await TaskHelper.WhenAllFastFail(migrateTasks).ConfigureAwait(false);
124124
}
125125

126-
public static DbContextOptions CreateShellDbContextOptions(IShardingRuntimeContext shardingRuntimeContext,Type dbContextType,string dataSourceName)
126+
public static DbContextOptions CreateShellDbContextOptions(IShardingRuntimeContext shardingRuntimeContext,string dataSourceName)
127127
{
128128
var virtualDataSource = shardingRuntimeContext.GetVirtualDataSource();
129129
var shardingConfigOptions = shardingRuntimeContext.GetShardingConfigOptions();
130-
var dbContextOptionBuilder = DataSourceDbContext.CreateDbContextOptionBuilder(dbContextType);
130+
var dbContextOptionBuilder =shardingRuntimeContext.GetDbContextOptionBuilderCreator().CreateDbContextOptionBuilder();
131131
var connectionString = virtualDataSource.GetConnectionString(dataSourceName);
132132
virtualDataSource.UseDbContextOptionsBuilder(connectionString, dbContextOptionBuilder);
133133
shardingConfigOptions.ShardingMigrationConfigure?.Invoke(dbContextOptionBuilder);

src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,9 @@ private DbContextOptions CreateShareDbContextOptionsBuilder()
154154
try
155155
{
156156
//先创建dbcontext option builder
157-
var dbContextOptionsBuilder = CreateDbContextOptionBuilder(DbContextType).UseShardingOptions(_shardingRuntimeContext);
158-
157+
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
158+
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder().UseShardingOptions(_shardingRuntimeContext);
159+
159160
if (IsDefault)
160161
{
161162
//如果是默认的需要使用shell的dbconnection为了保证可以使用事务
@@ -191,13 +192,6 @@ private DbContextOptions CreateShareDbContextOptionsBuilder()
191192
}
192193
}
193194

194-
public static DbContextOptionsBuilder CreateDbContextOptionBuilder(Type dbContextType)
195-
{
196-
Type type = typeof(DbContextOptionsBuilder<>);
197-
type = type.MakeGenericType(dbContextType);
198-
return (DbContextOptionsBuilder)Activator.CreateInstance(type);
199-
}
200-
201195
/// <summary>
202196
/// 不支持并发后期发现直接报错而不是用lock
203197
/// </summary>

src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public DbContext CreateDbContext(CreateDbContextStrategyEnum strategy, string da
114114

115115
private DbContextOptions CreateParallelDbContextOptions(string dataSourceName,CreateDbContextStrategyEnum strategy)
116116
{
117-
var dbContextOptionBuilder = DataSourceDbContext.CreateDbContextOptionBuilder(_shardingDbContext.GetType());
117+
var dbContextOptionBuilder =_shardingRuntimeContext.GetDbContextOptionBuilderCreator().CreateDbContextOptionBuilder();
118118
var connectionString = _actualConnectionStringManager.GetConnectionString(dataSourceName, CreateDbContextStrategyEnum.IndependentConnectionWrite==strategy);
119119
_virtualDataSource.UseDbContextOptionsBuilder(connectionString, dbContextOptionBuilder).UseShardingOptions(_shardingRuntimeContext);
120120
return dbContextOptionBuilder.Options;

src/ShardingCore/ShardingCoreExtension.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
using Microsoft.EntityFrameworkCore.Migrations;
3232
using ShardingCore.Bootstrappers;
3333
using ShardingCore.Core.DbContextCreator;
34+
using ShardingCore.Core.DbContextOptionBuilderCreator;
3435
using ShardingCore.Core.DbContextTypeAwares;
3536
using ShardingCore.Core.QueryTrackers;
3637
using ShardingCore.Core.RuntimeContexts;
@@ -144,6 +145,7 @@ internal static IServiceCollection AddInternalShardingCore<TShardingDbContext>(t
144145
.TryAddSingleton<IVirtualDataSourceConfigurationParams, SimpleVirtualDataSourceConfigurationParams>();
145146
//分表dbcontext创建
146147
services.TryAddSingleton<IDbContextCreator, ActivatorDbContextCreator<TShardingDbContext>>();
148+
services.TryAddSingleton<IDbContextOptionBuilderCreator, ActivatorDbContextOptionBuilderCreator>();
147149

148150

149151
// services.TryAddSingleton<IDataSourceInitializer<TShardingDbContext>, DataSourceInitializer<TShardingDbContext>>();

0 commit comments

Comments
 (0)