我可能描述错了,但这是我的困境,我有一系列接口(interface),比如 IBreadcrumbRetriever
.它们的实现完全不同,具体取决于它们在我的网站上的位置,我正在使用 HttpContext.Current.Request.Path
确定。
所以在我的具体类中,我现在有几个 if 语句来确定要返回的项目(为简单起见,假设 List<string>
)。这对我来说是一种代码味道。
我真正想要的是某种方式,我觉得 IoC 和 CaSTLe Windsor 可以帮助我解决这个问题,即确定用户点击页面是否满足特定条件并将正确的容器绑定(bind)到该条件。所以我会有类似的东西
if (HttpContext.Current.Request.Path == some condition)
IBreadcrumbRetriever is ImplementedBy IsInProductAreaRetriever
这是个好主意吗?如果是这样,我该怎么做?或者我是否像面包屑工厂类一样创建并使用“.DependsOn(HttpContext.Current.Request.Path)
”扩展来实现我正在做的事情?
最佳答案
这取决于您的应用架构是否适合依赖注入(inject)。
不熟悉 CaSTLe Windsor 但一般来说,如果无法在组合根(应用程序启动)处解决依赖关系,我认为注入(inject)适用于当前 http 上下文的工厂实现没有任何问题。
例如,在 ASP.NET 应用程序中,您的组合根将位于 global.asax
中。在那里,您可以将一些 IBreadcrumbRetrieverFactory
绑定(bind)到 BreadcrumbRetrieverFactory
实现。 新建
不属于核心框架(以及一些核心框架)的类通常是错过 DI 机会(以及紧密耦合)的标志。
IoC 容器和 DI 不是 Elixir :依赖注入(inject)只是一种设计模式(想想构造函数注入(inject),只分配 private readonly
字段的构造函数 - 类型的依赖项)和 IoC 容器(所有这些)只不过是促进依赖关系与具体实现的连接的工具。考虑到这一点,没有什么是温莎城堡无法用穷人的 DI 实现的:关键在于尽可能早地插入依赖项的实例化 - 即在应用程序启动时, 组合根。
当一个依赖是“动态的”时,比如,当有一个逻辑决定 ISmurf
的实现应该是 HappySmurf
还是 GrumpySmurf
, 恕我直言,最好的办法是注入(inject) ISmurfFactory
依赖项而不是 ISmurf
,并将工厂的连接推送到组合根。
关于c# - 我可以或应该在运行时有条件地使用 CaSTLe Windsor 绑定(bind)接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202329/