c# - 我可以或应该在运行时有条件地使用 CaSTLe Windsor 绑定(bind)接口(interface)吗?

标签 c# dependency-injection castle-windsor

我可能描述错了,但这是我的困境,我有一系列接口(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/

相关文章:

c# - System.Web.Services.Protocols.SoapHeaderAttribute.Required 已过时 我现在应该使用什么?

c# - 如何以编程方式将 JavaScript 插入网页?

java - 使用 Guice 注入(inject)依赖项适用于一种方法,而不适用于另一种方法

c# - StructureMap 生命周期范围

c# - 如何在 Windows 窗体的构造函数中注入(inject)依赖项

c# - 在 C# 中获取 [DataMember] 的名称

ServiceBase.Run 未执行后控制台应用程序代码中的 C# Windows 服务?

java - 如何在使用spring自动布线时传递构造函数参数?

asp.net-mvc - 带参数的 MvcContrib Windsor 设置组件

c# - 为 MVC 中的每个请求创建和销毁的 Controller 实例 - WebAPI - 要注入(inject)的依赖范围是什么?