3

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

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

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

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

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

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

4

4 回答 4

2

这不是您问题的直接答案,因为我不熟悉 Castle-windsor,而且我不是 IoC 专家,但根据我对 Spring 的 java 版本的经验,我可以说(我说的是 Spring在这里,所以可能不是castle-windsor的情况)它不仅仅是依赖注入部分,还有框架本身:声明性事务管理,内置安全框架,ORM支持,内置MVC Web 框架、RMI、Web 服务、Email、AOP 等。它们都与 IoC 很好地集成在一起,并且对于大多数典型场景,框架确实为您做了很多工作。

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

我不知道 Castle-windsor 是否是 IoC 容器之外的任何东西,但如果是的话,就其作为框架的功能的丰富性而言,它可能还不存在。

于 2008-11-19T19:56:21.327 回答
2

好像你想要这个问题的答案

显然,如果系统像您所说的那样难以设置,那么在您维护它时它就不值得了。在使用新技术时要牢记这一点。有时,仅仅因为这个因素,旧无聊的东西会更好。

Castle Windsor 本身使用反射,所以它确实是一个包装器,可以按照你想要的方式做事。如果您可以开发一个比 CW 更易于使用的系统,那么您应该这样做,即使它会在初始启动时间上花费您。该成本将首先被 CW 的学习曲线所抵消,因此不会像重新发明轮子一样。

他们自己说 IoC 不适合小项目,

此外,根据项目的规模和复杂性,IoC 容器可能会过大。更喜欢在大中型项目上使用它。

于 2008-11-19T19:57:07.300 回答
1

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

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

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

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

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

  • 智能,因为它了解您拥有的依赖关系,并递归地为您创建它们。

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

  • 非侵入性,因为使用的对象不需要知道容器。

    -

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

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

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

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

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

您可以将其设施概念与 NHibernate 平滑集成

于 2008-11-19T21:31:19.277 回答
0

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

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

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

于 2008-11-20T17:50:57.990 回答