在 .NET Core 中選擇適當的 DbProviderFactory?



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

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

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

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

配置中的连接字符串设置具有提供程序属性的位置。 如果本地配置了正确的提供程序,则可以按如下方式使用它:

[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 核心不包括反射,因此这不会开箱即用。

相关内容

  • 没有找到相关文章

最新更新