背景
我有许多由依赖于要创建的连接字符串的组件实现的服务 - 例如:
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
项。
MyIImportantController
有一个构造函数和参数IImportantRepository
。MyIControllerFactory
是组合根(不包括引导程序),并IWindsorContainer.Resolve<T>()
在运行时用于激活作业的正确控制器。
所以我想整个事情在引导时看起来像这样:
Global.Asax => ControllerBuilder.Current => MyControllerFactory : IControllerFactory
这在请求时:
IControllerFactory => IImportantController => IImportantRepository => IOracleConnection
动机
现在,在一个应用程序中,IOracleConnection
(以及构建它的底层字符串)在以下情况下可能是已知的:
- 应用程序被设计(用于测试的虚构连接字符串)
- 应用程序已编译(完全由构建变量确定的连接字符串)
- 应用程序已部署(转换中设置的连接字符串
web.config
) - 应用程序被引导(在配置源中设置的连接字符串只读一次)
- 应用程序处理某种类型的请求(例如,“通常”但不是“总是”您想要显示来自的数据
ProductionDb
) - 应用程序处理一个连接被参数化的请求(一个管理
Important
东西的请求,ChicagoDb
而不是NewYorkDb
,或其他) - 应用程序处理一个请求,其中会话或用户详细信息完全决定了连接(10% 的用户继续使用
Db1
,其余用户Db2
根据设计继续使用)
问题
您将如何编写可维护的代码而不过多地违反 DRY,从而同时为同一个图实现相同依赖项的所有这些潜在用途?