ここでいくつかの悪い解決策の間にこだわっていて、将来の苦痛を最小限に抑える方法についていくつかアドバイスが必要だと思います。ここで私のために重要な部分は、それがConfigurationManager
からの接続文字列を読み込むことであるコンストラクタの動作を変更するための最低悪い方法
var _providerName = "System.Data.SqlClient";
if (ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName != null)
_providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
_factory = DbProviderFactories.GetFactory(_providerName);
ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
:私たちは、そのコンストラクタでこれらの行を持つ大規模なORMを使用しています。設定を一元化しようとしていますが、これを実行する際にweb/app.configsから接続文字列を削除する必要があります(約150の配備されたホストがあるため、オーバーヘッドが大きくなっています)。ただし、ここで設定ファイルの読み取りはハードコードされており、ConnectionStrings
コレクションは読み取り専用です(回避策がありますが、すべてがかなり汚れています)。
これらの行を仮想メソッドに抽出し、それを継承で変更する方法があります。しかし、Massiveを更新したいときや、コンストラクタから仮想メソッドを呼び出すときに潜在的に悪いことがあるときにはこれは素晴らしいことではありません。
その他の代替手段はありますか?ここでの主な優先事項は、更新時の影響を最小限に抑えることです。
これはService Locatorパターンの機会のように聞こえます:http://en.wikipedia.org/wiki/Service_locator_pattern –
@ JoshC:はい、もう一つの方法は、それをデフォルトの値を持ついくつかのインターフェース 'IConfigurationManager'にリファクタリングすることです実装は単にConfigurationManagerを使用します。私はしかし、遺産と比較して賛否両論は何ですか? – carlpett
接続文字列を別のファイルに保存するのはどうですか?それが助けになるだろうか? (「外部構成ファイルの使用」msdn.microsoft.com/en-us/library/ms254494(v=vs.80).aspxを参照) –