C# 是否有Windsor扩展点或通用IoC技术来处理一个根目录下的许多场景中所需的原始依赖关系? 背景
我有许多服务是由依赖于要创建的连接字符串的组件实现的,例如:C# 是否有Windsor扩展点或通用IoC技术来处理一个根目录下的许多场景中所需的原始依赖关系? 背景,c#,inversion-of-control,naming-conventions,castle-windsor,compositionroot,C#,Inversion Of Control,Naming Conventions,Castle Windsor,Compositionroot,我有许多服务是由依赖于要创建的连接字符串的组件实现的,例如: public interface IImportantRepository { ... } public class ImportantRepository { public ImportantRepository(IOracleConnection connection) { ... } public ImportantRepository(string connectionString) { ... } // r
public interface IImportantRepository { ... }
public class ImportantRepository
{
public ImportantRepository(IOracleConnection connection) { ... }
public ImportantRepository(string connectionString) { ... } // rarely my constructor of choice, but included for clarity
}
我通常更喜欢第一个构造函数而不是第二个构造函数,因为为了使用连接字符串,我必须用它创建一个连接,这反过来需要使用string
依赖项解析IOracleConnection
我的IImportantController
有一个构造函数和参数IImportantRepository
。MyIControllerFactory
是合成根目录(不包括引导程序),并在运行时使用IWindsorContainer.Resolve()
为作业激活正确的控制器
所以我想整个过程在引导时是这样的:
Global.Asax => ControllerBuilder.Current => MyControllerFactory : IControllerFactory
在请求时:
IControllerFactory => IImportantController => IImportantRepository => IOracleConnection
动机
现在,在一个应用程序中,IOracleConnection
(以及构建它的底层字符串)可能在以下情况下已知:
- 设计应用程序(用于测试的虚拟连接字符串)
- 编译应用程序(完全由构建变量确定的连接字符串)
- 部署应用程序(在
转换中设置的连接字符串)web.config
- 应用程序已引导(配置源中设置的连接字符串只读一次)
- 应用程序处理特定类型的请求(例如,“通常”但不是“始终”您希望显示来自
ProductionDb的数据)
- 应用程序处理连接参数化的请求(管理
中的ChicagoDb
内容的请求,而不是重要
或其他任何内容的请求)NewYorkDb
- 应用程序处理一个请求,其中会话或用户详细信息完全决定了连接(10%的用户生活在
上,其余的用户生活在Db1
上,按设计)Db2
如何编写可维护的代码而不违反DRY,从而同时实现同一图形中相同依赖项的所有这些潜在用途?原语与其他组件可能依赖并在容器中注册的任何其他类型非常相似。它们可以命名,可以从一些静态上下文(例如配置文件、环境变量或当前用户会话)中解析,等等 您列出的场景都可以应用于复杂类型或基本类型,其中大多数都有干净的解决方案 但是,在处理原语时有两个挑战:
IOracleProductionDatabaseConnectionSettings
的组件都将从容器中解析正确的设置,而不需要任何魔术字符串
public interface IMSSqlDatabaseConnectionSettings
{
string ConnectionString { get; set; }
}
public interface IOracleDatabaseConnectionSettings
{
string ConnectionString { get; set; }
}