2012-10-16 7 views
5

ここでいくつかの悪い解決策の間にこだわっていて、将来の苦痛を最小限に抑える方法についていくつかアドバイスが必要だと思います。ここで私のために重要な部分は、それが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を更新したいときや、コンストラクタから仮想メソッドを呼び出すときに潜在的に悪いことがあるときにはこれは素晴らしいことではありません。

その他の代替手段はありますか?ここでの主な優先事項は、更新時の影響を最小限に抑えることです。

+1

これはService Locatorパターンの機会のように聞こえます:http://en.wikipedia.org/wiki/Service_locator_pattern –

+0

@ JoshC:はい、もう一つの方法は、それをデフォルトの値を持ついくつかのインターフェース 'IConfigurationManager'にリファクタリングすることです実装は単にConfigurationManagerを使用します。私はしかし、遺産と比較して賛否両論は何ですか? – carlpett

+0

接続文字列を別のファイルに保存するのはどうですか?それが助けになるだろうか? (「外部構成ファイルの使用」msdn.microsoft.com/en-us/library/ms254494(v=vs.80).aspxを参照) –

答えて

1

最後に、大規模なクラスを部分的にすることで最小限の変更を加えることにしました。その後、別のファイルで、異なるパラメータを受け入れたコンストラクタを追加しました。この方法で、ライブラリを更新する場合、変更する必要があるのはpartialを再度追加することだけです。

1

コンストラクタを介して必要なすべてのフィールドを渡すことで、オブジェクトの構成ソースの依存関係を排除できます。

依存性注入に関するMartin Fowler's articleを参照してください。同じ概念がここに適用されます。

関連する問題