gpt4 book ai didi

c# - 在 .NET Core 中选择合适的 DbProviderFactory?

转载 作者:行者123 更新时间:2023-12-04 13:44:14 24 4
gpt4 key购买 nike

我有一个需要 DbProviderFactory 的 .net 核心库作为依赖传递到服务中。在可预见的 future 它应该是 SQL Server,所以我想我可以做这样的事情:

services.AddSingleton<IMyService>(di=>new MyService(SqlClientFactory.Instance));

...但我的 appsettings.json 文件中有多个 db 连接字符串,我没有看到告诉 Instance 的机制使用哪个连接。

我如何配置 DbProviderFactory使用正确的连接和连接字符串? appsettings 文件中没有连接或提供程序的“名称”概念。

最佳答案

配置中的连接字符串设置有一个位置 provider property .鉴于在本地配置了正确的提供程序,您可以按如下方式使用它:

[System.Configuration.ConfigurationProperty("providerName", DefaultValue=Mono.Cecil.CustomAttributeArgument)] public string ProviderName { get; set; }


<connectionStrings>
<add name="Example"
providerName="System.Data.SqlClient"
connectionString="Data Source=1.1.1.1;Integrated Security=True"/>
</connectionStrings>

可以这样调用:
DbProviderFactories.GetFactory(settings.ProviderName);

通常,如果您只有一个 DBConnection,您可以创建一个辅助方法来检索 ProviderFactory:
public static DbProviderFactory GetProviderFactory(DbConnection connection)
{
DbProviderFactory providerFactory = null;
Type connectionType = connection.GetType();
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;

// Check for DbConnection.DbProviderFactory
PropertyInfo providerFactoryInfo = connectionType.GetProperty("DbProviderFactory", flags);
if (providerFactoryInfo != null)
providerFactory = (DbProviderFactory)providerFactoryInfo.GetValue(connection, null);

// Check for DbConnection.ConnectionFactory.ProviderFactory
if (providerFactory == null)
{
PropertyInfo connectionFactoryInfo = connectionType.GetProperty("ConnectionFactory", flags);
object connectionFactory = connectionFactoryInfo.GetValue(connection, null);
providerFactoryInfo = connectionFactory.GetType().GetProperty("ProviderFactory", flags);
providerFactory = (DbProviderFactory)providerFactoryInfo.GetValue(connectionFactory, null);
}

// No match
if (providerFactory == null)
throw new InvalidOperationException("ProviderFactory not found for connection");

return providerFactory;
}

但是 .NET 核心不包括反射,所以这不会开箱即用。

关于c# - 在 .NET Core 中选择合适的 DbProviderFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51956218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com