2017-12-18 16 views
0

ConfigurationManager.ConnectionStrings静的なプロパティで、実行時にで提供される任意の構成ファイルから一連の接続文字列にアクセスしようとしています。アプリケーションコードは接続文字列がこのコレクションに入ることを期待しており、デフォルトの構成ファイルを編集せずに新しい値を提供する必要があります。私は例えば、私はSystem.Configuration.ExeConfigurationFileMapを使用して、任意の構成ファイルから接続文字列をロードするためにSystem.Configuration.ConfigurationManager.OpenMappedExeConfigurationを使用できると判断した`System.Configuration.ConfigurationManager.ConnectionStrings`をデフォルト以外の設定ファイル値で更新できますか?

using System.Configuration; 

var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap{ExeConfigFilename = 'some.config'}, ConfigurationUserLevel.None); 

config.RefreshSection(config.ConnectionStrings.SectionInformation.SectionName); 

この文脈では、私は、接続文字列にアクセスできることを期待したいです静的ConfigurationManager.ConnectionStringsプロパティからsome.configからロードされましたが、これはアプリケーション設定のデフォルトで使用可能だったものだけを保持するようです。

静的ConfigurationManager.ConnectionStringsプロパティの値を更新するために、デフォルト設定にマスクまたはコピーすることはできますか?あるいは、デフォルトコンフィギュレーションを新しいコンフィギュレーションファイルに定義し直して、実行時にと定義し、最終的に望ましい結果につなげる方法はありますか?

+0

この直後 - 'ConfigurationManager.OpenMappedExeConfiguration' - ' config'の 'HasFile'プロパティをチェックします。場合によってはファイルをロードしていないにもかかわらず例外をスローしないような悪質なことを行うこともあります。あなたのファイルに何が含まれていない 'Configuration'オブジェクトを与えます。 –

+0

いいえ、 'HasFile'プロパティは' true'で、 'FilePath'は接続文字列を持つデフォルト以外の設定ファイルです。 – jmlane

+0

アプリケーションの設計を変更して、接続、接続マネージャーや構成サービスなどのための特別なサービスを使用することはできません。 – NSGaga

答えて

1

短い答えはノーです。 ConnectionStringsAppSettingsのプロパティーはConfigurationManagerです。これは、便宜上、デフォルト構成から読み取るためのものです。他の設定を読み込むことはできますが、それらのメソッドの動作を変更することはできません。

このConfigurationが正しくロードされている場合:

var config = ConfigurationManager.OpenMappedExeConfiguration(
    new ExeConfigurationFileMap{ExeConfigFilename = 'some.config'}. 
     ConfigurationUserLevel.None); 

次に、あなたがそこから接続文字列を取得することができます。

var connectionString = config.ConnectionStrings.ConnectionStrings["connectionName"] 
    .ConnectionString; 

答えの一部は、あなたのクラスの中に深いからConfigurationManagerまたはConfigurationを使用することではありません。依存関係注入を使用することもできますし、最悪の場合のシナリオでは、ConfigurationManagerの代わりに独自の静的クラスを作成して使用することもできます。しかし、これはクラスの動作を変更できないため、クラスに直接アクセスしたくない理由の完全な例です。

+1

私はそれが彼の後にあるとは思わない。彼は 'ConfigurationManagerのマッピングをしたい。ConnectionStrings'は、実行時に設定された動的なものを指し示します。少なくとも、それは私が読んでいるものです。 – NSGaga

+0

このコードを変更して、.NETの設定について知っていることを知っていれば、私はConfigurationManagerの静的コレクションへの依存関係を削除します。今のところ、私はコードのために存在する代替案を探っています。 – jmlane

0

興味深い反射回避策私はdiscoveredの反射を使用してSystem.Configuration.ConfigurationManager.ConnectionStringsの非公共System.Configuration.ConfigurationElementCollection .bReadOnlyプロパティを変更することができます:

using System; 
using System.Configuration; 

var connectionString = "..."; 
var connectionStringSetting = new ConnectionStringSettings("OrionDB", connectionString); 
var field = ConfigurationElementCollection.GetField("bReadOnly", 
    Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance); 
var connectionStrings = ConfigurationManager.ConnectionStrings; 
field.SetValue(connectionStrings, false); 
connectionStrings.Add(connectionStringSetting); 

これはしばらく必ずしも私に静的ConfigurationManagerプロパティの使用目的を望ましい行動を行いました。

関連する問題