.NET 领域的很多人都选择了 Castle Windsor 并在他们的项目中实现它,在过去的一年里,我一直在努力弄清楚为什么 IoC 容器似乎被视为一般的“最佳实践”?我读过很多关于温莎之类的原因的摘要和简短解释,但它们中的每一个确实都很抽象,并且对于我接触过的大多数项目来说似乎并不实用,但最近我一直在遇到很多使用 Windsor 的项目,我不明白为什么。

C#/.NET 本质上支持基于接口的编码、抽象对象、委托和事件。人们可以直接从核心语言实现 IoC,并使用反射等来实例化实现已知接口的未知实例,而无需求助于 IoC 容器库。

当使用 YAGNI/AYGNI(你会需要它吗?)时,我觉得 Windsor 被过度使用了。我当然可以看到 IoC 容器的好处,但我觉得这些好处是以额外的依赖项和元数据为代价的(核心代码中调用的 IoC 容器特定属性和方法、分散在各处的 .config 文件、app.config/web.config充满了绑定标签,使 .config 文件更难以编辑,等等),所以我试图找出权衡。

也就是说,我接受我正在做的可能性 全部 这些观察/陈述是关于无知的,因为我从未深入参与过使用 Windsor 或其他 IoC 容器库的项目。我真正需要的是有人演示一个使用 IoC 容器库的“平均”或“典型”项目,以及为什么这应该是一个“最佳实践”,而对我来说,这似乎会让一个原本干净的项目变得混乱具有依赖项和元数据。

如果有人知道任何博客文章、文章或书籍可以满足我的需求,那就太好了。

(我不是为了争论而争论,而是因为我真的很想接受教育,知道我是否应该在 IoC 容器方面进行自我教育)。

其他提示

这不是你问题的直接答案,因为我不熟悉castle-windsor,而且我不是IoC专家,但根据我对Spring版java的经验,我可以说(我是在这里谈论春天,所以它可能不是城堡 - 温莎的情况) 它不仅仅是依赖注入部分使它变得更好,而且还有框架本身:声明式事务管理,内置安全框架,ORM支持,内置MVC Web框架,RMI,Web服务,电子邮件,AOP等。它与IoC很好地集成在一起,在大多数典型情况下,fraework确实为你做了很多工作。

使用注释+ IDE支持自动装配(例如Spring的IntelliJ IDEA)我认为可以缓解配置文件问题。

我不知道castle-windsor除了IoC容器之外是否还有什么东西,但是如果是这样的话,可能它还没有就其作为框架的丰富功能而言。

我不一定相信 IoC 容器在所有情况下都是好的。但绝对可以。如果您使用依赖项注入或服务定位器来处理依赖项,那么您已经取得了很大的进步,但是 IoC 容器可以帮助您自动执行操作,为您提供对更高级场景的支持等。

不久前我试图在一篇博客文章中为自己定义它:

控制反转 (IoC) 容器是一种非侵入式可配置智能工厂组件

将这个定义分成几部分,我们得到

  • 工厂,因为它负责为你创建对象。

  • 智能,因为它了解您拥有哪些依赖项,并递归地为您创建它们。

  • 可配置,因为可以通过代码或配置文件来配置使用情况。

  • 非侵入性,因为所使用的对象不需要了解容器。

    -

如果您正确地将它与依赖项注入或服务定位器模式一起使用,您确实会获得一些非常方便的好处。您不一定需要使用像 Winsor 这样的外部容器,但这确实给您带来了一些额外的好处。

您可以编写更少的代码来实例化新对象。如果您考虑更复杂的对象层次结构,IoC 容器可以帮助您自动创建整个链。这可能非常强大。

您可以在测试期间轻松添加对象的模拟版本,不会出现任何问题(如果您使用 DI 和/或 SL)。例如,为自己创建一个服务定位器也可以解决这个问题。

更改要在构造函数中注入的依赖项并不一定意味着您需要重构大量代码。

通过一个来源建立隧道依赖关系可以带来多种好处:装饰器、拦截器、代理以及处理对象的生活方式。使用像 Windsor 这样的容器,这使您能够非常简单地完成一些困难的事情,并且耦合极少

您可以利用其工具概念与 NHibernate 等顺利集成

我建议您收听Software Engineering Radio播客的第2集。这是关于依赖注入的整个情节。依赖注入是反转控制框架的最广为人知的用法。我还建议听一下有关John Kovacs的DotNetRocks第362集。 此处是该节目的成绩单。

现在IOC的副作用是增加可测试性。像Castle Windsor这样的IOC容器的使用有助于解耦依赖关系。这种去耦使得更好的单元测试。

大多数IOC框架还提供了促进面向方面编程的方法。因此,如果你进入IOC容器框架可以帮助你。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top