Skip to content

Commit 7539631

Browse files
authored
feat: implement clickhouse connection factory with IClickhouseDataSource (#305)
1 parent 39594ad commit 7539631

File tree

7 files changed

+36
-27
lines changed

7 files changed

+36
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,17 @@
11
using System.Data;
2-
using ClickHouse.Client.ADO;
2+
using ClickHouse.Client;
33
using Cnblogs.Architecture.Ddd.Infrastructure.Dapper;
44

55
namespace Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse;
66

77
/// <summary>
88
/// Clickhouse connection factory.
99
/// </summary>
10-
public class ClickhouseDbConnectionFactory : IDbConnectionFactory
10+
public class ClickhouseDbConnectionFactory(IClickHouseDataSource dataSource) : IDbConnectionFactory
1111
{
12-
private readonly string _connectionString;
13-
14-
/// <summary>
15-
/// Create a clickhouse connection factory.
16-
/// </summary>
17-
/// <param name="connectionString">The connection string.</param>
18-
public ClickhouseDbConnectionFactory(string connectionString)
19-
{
20-
_connectionString = connectionString;
21-
}
22-
2312
/// <inheritdoc />
2413
public IDbConnection CreateDbConnection()
2514
{
26-
return new ClickHouseConnection(_connectionString);
15+
return dataSource.CreateConnection();
2716
}
2817
}

src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/DapperConfigurationBuilderExtension.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public static void UseClickhouse<TContext>(
2121
string connectionString)
2222
where TContext : ClickhouseDapperContext
2323
{
24-
builder.UseDbConnectionFactory(new ClickhouseDbConnectionFactory(connectionString));
24+
builder.UseDbConnectionFactory<ClickhouseDbConnectionFactory>();
25+
builder.Services.AddClickHouseDataSource(connectionString);
2526
builder.Services.AddSingleton(new ClickhouseContextOptions<TContext>(connectionString));
2627
builder.Services.Configure<ClickhouseContextCollection>(x => x.Add<TContext>());
2728
builder.Services.AddHostedService<ClickhouseInitializeHostedService>();

src/Cnblogs.Architecture.Ddd.Cqrs.Dapper/DapperConfigurationBuilder.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,23 @@ public DapperConfigurationBuilder(IServiceCollection services)
2929
/// <param name="factory">工厂对象。</param>
3030
/// <typeparam name="TFactory">工厂类型。</typeparam>
3131
public void UseDbConnectionFactory<TFactory>(TFactory factory)
32-
where TFactory : IDbConnectionFactory
32+
where TFactory : class, IDbConnectionFactory
3333
{
34+
Services.AddSingleton(factory);
3435
Services.Configure<DbConnectionFactoryCollection>(
35-
c => c.AddDbConnectionFactory(_dapperContextTypeName, factory));
36+
c => c.AddDbConnectionFactory(_dapperContextTypeName, typeof(TFactory)));
37+
}
38+
39+
/// <summary>
40+
/// Add <typeparamref name="TFactory"/> as <see cref="IDbConnectionFactory"/> and get instance from DI when used.
41+
/// </summary>
42+
/// <typeparam name="TFactory">The factory type.</typeparam>
43+
public void UseDbConnectionFactory<TFactory>()
44+
where TFactory : class, IDbConnectionFactory
45+
{
46+
Services.AddSingleton<TFactory>();
47+
Services.Configure<DbConnectionFactoryCollection>(
48+
c => c.AddDbConnectionFactory(_dapperContextTypeName, typeof(TFactory)));
3649
}
3750

3851
/// <summary>

src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/ClickhouseDapperContext.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ public abstract class ClickhouseDapperContext : DapperContext
1515
/// </summary>
1616
/// <param name="dbConnectionFactoryCollection">The underlying <see cref="IDbConnectionFactory"/> collection.</param>
1717
/// <param name="options">The options used for this context.</param>
18+
/// <param name="serviceProvider">The service provider to use.</param>
1819
protected ClickhouseDapperContext(
1920
IOptions<DbConnectionFactoryCollection> dbConnectionFactoryCollection,
20-
ClickhouseContextOptions options)
21-
: base(dbConnectionFactoryCollection)
21+
ClickhouseContextOptions options,
22+
IServiceProvider serviceProvider)
23+
: base(dbConnectionFactoryCollection, serviceProvider)
2224
{
2325
_options = options;
2426
}

src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
</ItemGroup>
1414

1515
<ItemGroup>
16-
<PackageReference Include="ClickHouse.Client" Version="7.9.1" />
16+
<PackageReference Include="ClickHouse.Client" Version="7.10.1" />
1717
</ItemGroup>
1818

1919
</Project>

src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DapperContext.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using System.Data;
2-
2+
using Microsoft.Extensions.DependencyInjection;
33
using Microsoft.Extensions.Options;
44

55
namespace Cnblogs.Architecture.Ddd.Infrastructure.Dapper;
@@ -13,9 +13,13 @@ public abstract class DapperContext
1313
/// 创建一个 DapperContext。
1414
/// </summary>
1515
/// <param name="dbConnectionFactoryCollection">数据库连接工厂集合。</param>
16-
protected DapperContext(IOptions<DbConnectionFactoryCollection> dbConnectionFactoryCollection)
16+
/// <param name="sp">The service provider to get connection factory</param>
17+
protected DapperContext(IOptions<DbConnectionFactoryCollection> dbConnectionFactoryCollection, IServiceProvider sp)
1718
{
18-
DbConnectionFactory = dbConnectionFactoryCollection.Value.GetFactory(GetType().Name);
19+
var type = dbConnectionFactoryCollection.Value.GetFactory(GetType().Name);
20+
DbConnectionFactory = sp.GetRequiredService(type) as IDbConnectionFactory
21+
?? throw new InvalidOperationException(
22+
$"No DbConnectionFactory(type: {type.Name}) configured.");
1923
}
2024

2125
/// <summary>

src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DbConnectionFactoryCollection.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@
55
/// </summary>
66
public class DbConnectionFactoryCollection
77
{
8-
private readonly Dictionary<string, IDbConnectionFactory> _factories = new();
8+
private readonly Dictionary<string, Type> _factories = new();
99

1010
/// <summary>
1111
/// 添加数据库连接工厂。
1212
/// </summary>
1313
/// <param name="name">名称。</param>
1414
/// <param name="factory">工厂示例。</param>
1515
/// <exception cref="InvalidOperationException">Throw when <paramref name="name"/> already been registered with other factory.</exception>
16-
public void AddDbConnectionFactory(string name, IDbConnectionFactory factory)
16+
public void AddDbConnectionFactory(string name, Type factory)
1717
{
1818
if (_factories.TryGetValue(name, out var value))
1919
{
2020
throw new InvalidOperationException(
21-
$"The dapper context already configured with db connection factory: {value.GetType().Name}");
21+
$"The dapper context already configured with db connection factory: {value.Name}");
2222
}
2323

2424
_factories.Add(name, factory);
@@ -29,7 +29,7 @@ public void AddDbConnectionFactory(string name, IDbConnectionFactory factory)
2929
/// </summary>
3030
/// <param name="name">名称。</param>
3131
/// <returns>工厂示例。</returns>
32-
public IDbConnectionFactory GetFactory(string name)
32+
public Type GetFactory(string name)
3333
{
3434
return _factories[name];
3535
}

0 commit comments

Comments
 (0)