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];
}