バックグラウンド
作成される接続文字列に依存するコンポーネントによって実装される多くのサービスがあります-たとえば:
public interface IImportantRepository { ... }
public class ImportantRepository
{
public ImportantRepository(IOracleConnection connection) { ... }
public ImportantRepository(string connectionString) { ... } // rarely my constructor of choice, but included for clarity
}
IOracleConnection
接続文字列を使用するには、接続文字列との接続を作成する必要があり、string
依存関係を解決する必要があるため、一般的には最初のコンストラクターを 2 番目のコンストラクターよりも優先します。
MyIImportantController
には の単一のコンストラクターとパラメーターがありますIImportantRepository
。MyIControllerFactory
はコンポジション ルート (ブートストラップはカウントされません) でありIWindsorContainer.Resolve<T>()
、実行時に使用して、ジョブの適切なコントローラーをアクティブ化します。
したがって、ブートストラップ時に全体が次のようになると思います。
Global.Asax => ControllerBuilder.Current => MyControllerFactory : IControllerFactory
そしてこれはリクエスト時に:
IControllerFactory => IImportantController => IImportantRepository => IOracleConnection
動機
現在、あるアプリケーションでは、IOracleConnection
(およびそれを構築する基礎となる文字列) は、次の場合に認識される場合があります。
- アプリケーションが設計されている (テスト用の架空の接続文字列)
- アプリケーションがコンパイルされます (ビルド変数によって完全に決定される接続文字列)
- アプリケーションがデプロイされている (
web.config
変換で設定された接続文字列) - アプリケーションがブートストラップされます (構成ソースで設定された接続文字列は 1 回だけ読み取られます)。
- アプリケーションは特定のタイプのリクエストを処理します (たとえば、「通常」ではなく、「常に」データを表示したい
ProductionDb
) 。 Important
アプリケーションは、接続がパラメーター化されている要求 (のChicagoDb
代わりに で管理する要求NewYorkDb
など)を処理します。- アプリケーションは、セッションまたはユーザーの詳細によって接続が完全に決定される要求を処理します (ユーザーの 10% は存続し
Db1
、残りはDb2
設計上存続します) 。
質問
同じグラフの同じ依存関係のこれらの潜在的な用途をすべて同時に達成するために、DRY に過度に違反することなく保守可能なコードをどのように作成しますか?