将连接设置文件传递给DatabaseProviderFactory,Ent Library

时间:2010-01-14 10:26:49

标签: c# .net enterprise-library

我正在使用.NET 3.5 / C#,我遇到的问题是我需要能够加密和解密.config文件,该文件包含我与EnterpriseLibrary.Data.DatabaseProviderFactory一起使用的所有数据库连接,如图所示在问题结束时。 这种加密和解密是自定义的,并且使用已知密钥完成,并且必须对每台机器都相同,因此我没有使用ProtectSection。

我正在尝试读取加密的configurationSetings.config文件,解密内存中的文件并传递解密的文件 该文件的内容到DatabaseProviderFactory,以便它能够访问数据库连接设置。

我目前(非加密配置文件)使用MS Enterprise Libraries(v2)DatabaseProviderFactory与FileConfigurationSource类结合查看App.config文件以获取ConnectionSettings.config文件的名称,我在其中存储数据库连接设置。

然后我使用ConnectionSettings文件的路径传递给FileConfigurationSource,然后将结果传递给DatabaseProviderFactory 这允许我创建一个数据库实例。

我不想将未加密的文件写入文件系统并将其读回。 我正在寻找使用隔离存储的选项,但据我所知,您无法获得使用独立存储创建的文件的直接路径。

也许有一种方法可以创建自定义ConfigurationSource,或者允许我将解密的内容直接传递到DatabaseProviderFactory中以创建数据库实例。

所以本质上我需要读取一个加密的configurationSetings.config文件,解密内存中的文件并传递解密 该文件的内容到DatabaseProviderFactory,以便它能够访问数据库连接设置或类似的东西,以便我可以映射到Microsoft.Practices.EnterpriseLibrary.Data.Database。

非常感谢任何代码和/或建议。

先谢谢。

戴夫

的app.config

  <enterpriseLibrary.ConfigurationSource selectedSource="fileSource">
    <sources>
      <add
        name="fileSource"
        type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5b2b86dc1561d89b"
        filePath ="ConnectionSettings.config" />
      <add
        name="systemSource"
        type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SystemConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5b8b89dc1061d43b" />
    </sources>
  </enterpriseLibrary.ConfigurationSource>

方法代码:

Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource fileConfig =
   new Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource(connectionSettingsConfigFile);

Microsoft.Practices.EnterpriseLibrary.Data.DatabaseProviderFactory dbProvider =
   new Microsoft.Practices.EnterpriseLibrary.Data.DatabaseProviderFactory(fileConfig);

if (string.IsNullOrEmpty(databaseConnectionName))
{
   database = dbProvider.CreateDefault();
}
else
{
   database = dbProvider.Create(databaseConnectionName);
}

CONNECTIONSETTINGS.CONFIG

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5b2b86dc1561d89b" />
  </configSections>

  <dataConfiguration defaultDatabase="defaultConnection" />
  <connectionStrings>
    <add name="defaultConnection" connectionString="Data Source=192.11.111.11;Initial Catalog=TestDB;User Id:Test;Password:test"
        providerName="System.Data.SqlClient" />

  </connectionStrings>
</configuration>

似乎不是使用DatabaseProviderFactory,如果将其更改为使用特定的实现(如SqlDatabase),它允许您将connectionString作为其构造函数的一部分传递,这样可以更灵活一些。因为我现在正在使用SqlDatabase,我现在需要弄清楚的是如何将解密的配置文件的内容作为字符串传递给Configuration对象。任何想法?

1 个答案:

答案 0 :(得分:2)

我最终创建了一个自定义配置文件,模仿使用ConfigurationSettings类的基础来读取.config文件,所以实际上我删除了Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings配置部分,用自定义配置类替换它。

希望这有助于某人。