From a62792f556a456b6c7f6705844c0e131cd8b7679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=88=E6=98=9F=E7=B9=81?= Date: Fri, 7 Feb 2025 11:58:13 +0800 Subject: [PATCH] feat: implement clickhouse connection factory with IClickhouseDataSource --- .../ClickhouseDbConnectionFactory.cs | 17 +++-------------- .../DapperConfigurationBuilderExtension.cs | 3 ++- .../DapperConfigurationBuilder.cs | 17 +++++++++++++++-- .../ClickhouseDapperContext.cs | 6 ++++-- ....Ddd.Infrastructure.Dapper.Clickhouse.csproj | 2 +- .../DapperContext.cs | 10 +++++++--- .../DbConnectionFactoryCollection.cs | 8 ++++---- 7 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseDbConnectionFactory.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseDbConnectionFactory.cs index 6021841..e2e43b7 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseDbConnectionFactory.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseDbConnectionFactory.cs @@ -1,5 +1,5 @@ using System.Data; -using ClickHouse.Client.ADO; +using ClickHouse.Client; using Cnblogs.Architecture.Ddd.Infrastructure.Dapper; namespace Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse; @@ -7,22 +7,11 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse; /// /// Clickhouse connection factory. /// -public class ClickhouseDbConnectionFactory : IDbConnectionFactory +public class ClickhouseDbConnectionFactory(IClickHouseDataSource dataSource) : IDbConnectionFactory { - private readonly string _connectionString; - - /// - /// Create a clickhouse connection factory. - /// - /// The connection string. - public ClickhouseDbConnectionFactory(string connectionString) - { - _connectionString = connectionString; - } - /// public IDbConnection CreateDbConnection() { - return new ClickHouseConnection(_connectionString); + return dataSource.CreateConnection(); } } diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/DapperConfigurationBuilderExtension.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/DapperConfigurationBuilderExtension.cs index 590eace..bf5d921 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/DapperConfigurationBuilderExtension.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/DapperConfigurationBuilderExtension.cs @@ -21,7 +21,8 @@ public static void UseClickhouse( string connectionString) where TContext : ClickhouseDapperContext { - builder.UseDbConnectionFactory(new ClickhouseDbConnectionFactory(connectionString)); + builder.UseDbConnectionFactory(); + builder.Services.AddClickHouseDataSource(connectionString); builder.Services.AddSingleton(new ClickhouseContextOptions(connectionString)); builder.Services.Configure(x => x.Add()); builder.Services.AddHostedService(); diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper/DapperConfigurationBuilder.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper/DapperConfigurationBuilder.cs index 95cb79a..62a3542 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper/DapperConfigurationBuilder.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper/DapperConfigurationBuilder.cs @@ -29,10 +29,23 @@ public DapperConfigurationBuilder(IServiceCollection services) /// 工厂对象。 /// 工厂类型。 public void UseDbConnectionFactory(TFactory factory) - where TFactory : IDbConnectionFactory + where TFactory : class, IDbConnectionFactory { + Services.AddSingleton(factory); Services.Configure( - c => c.AddDbConnectionFactory(_dapperContextTypeName, factory)); + c => c.AddDbConnectionFactory(_dapperContextTypeName, typeof(TFactory))); + } + + /// + /// Add as and get instance from DI when used. + /// + /// The factory type. + public void UseDbConnectionFactory() + where TFactory : class, IDbConnectionFactory + { + Services.AddSingleton(); + Services.Configure( + c => c.AddDbConnectionFactory(_dapperContextTypeName, typeof(TFactory))); } /// diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/ClickhouseDapperContext.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/ClickhouseDapperContext.cs index 5d648ba..d95ec15 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/ClickhouseDapperContext.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/ClickhouseDapperContext.cs @@ -15,10 +15,12 @@ public abstract class ClickhouseDapperContext : DapperContext /// /// The underlying collection. /// The options used for this context. + /// The service provider to use. protected ClickhouseDapperContext( IOptions dbConnectionFactoryCollection, - ClickhouseContextOptions options) - : base(dbConnectionFactoryCollection) + ClickhouseContextOptions options, + IServiceProvider serviceProvider) + : base(dbConnectionFactoryCollection, serviceProvider) { _options = options; } diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse.csproj index 31688f7..c4692f5 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse.csproj +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.Clickhouse.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DapperContext.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DapperContext.cs index 77acd16..effe5be 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DapperContext.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DapperContext.cs @@ -1,5 +1,5 @@ using System.Data; - +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Cnblogs.Architecture.Ddd.Infrastructure.Dapper; @@ -13,9 +13,13 @@ public abstract class DapperContext /// 创建一个 DapperContext。 /// /// 数据库连接工厂集合。 - protected DapperContext(IOptions dbConnectionFactoryCollection) + /// The service provider to get connection factory + protected DapperContext(IOptions dbConnectionFactoryCollection, IServiceProvider sp) { - DbConnectionFactory = dbConnectionFactoryCollection.Value.GetFactory(GetType().Name); + var type = dbConnectionFactoryCollection.Value.GetFactory(GetType().Name); + DbConnectionFactory = sp.GetRequiredService(type) as IDbConnectionFactory + ?? throw new InvalidOperationException( + $"No DbConnectionFactory(type: {type.Name}) configured."); } /// diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DbConnectionFactoryCollection.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DbConnectionFactoryCollection.cs index 3b25a93..9af85ef 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DbConnectionFactoryCollection.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/DbConnectionFactoryCollection.cs @@ -5,7 +5,7 @@ /// public class DbConnectionFactoryCollection { - private readonly Dictionary _factories = new(); + private readonly Dictionary _factories = new(); /// /// 添加数据库连接工厂。 @@ -13,12 +13,12 @@ public class DbConnectionFactoryCollection /// 名称。 /// 工厂示例。 /// Throw when already been registered with other factory. - public void AddDbConnectionFactory(string name, IDbConnectionFactory factory) + public void AddDbConnectionFactory(string name, Type factory) { if (_factories.TryGetValue(name, out var value)) { throw new InvalidOperationException( - $"The dapper context already configured with db connection factory: {value.GetType().Name}"); + $"The dapper context already configured with db connection factory: {value.Name}"); } _factories.Add(name, factory); @@ -29,7 +29,7 @@ public void AddDbConnectionFactory(string name, IDbConnectionFactory factory) /// /// 名称。 /// 工厂示例。 - public IDbConnectionFactory GetFactory(string name) + public Type GetFactory(string name) { return _factories[name]; }