Castle windsor IoC容器适用性/场景演示?

Castle windsor IoC容器适用性/场景演示?,castle-windsor,ioc-container,Castle Windsor,Ioc Container,NET领域的许多人已经学习了Castle Windsor并将其应用到他们的项目中,在过去的一年里,我一直在努力弄清楚为什么IoC容器似乎被视为一般的“最佳实践”?我已经阅读了很多关于温莎和诸如此类的原因的摘要和简要解释,但它们中的每一个都是抽象的,似乎对我接触过的大多数项目都不实用,但最近我遇到了很多使用温莎的项目,我不明白为什么 C#/.NET固有地支持基于接口的编码、抽象对象、委托和事件。可以直接从核心语言实现IoC,并使用反射等方法实例化实现已知接口的未知实例,而无需借助IoC容器库 当使

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

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

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

也就是说,我接受了这样一种可能性,即我对无知的所有观察/陈述,因为我从未参与过使用温莎或其他国际奥委会容器库的项目。我真正需要的是有人来演示一个“普通”或“典型”的项目,其中使用了一个IoC容器库,以及为什么在我看来这是一个“最佳实践”,而在我看来,这似乎使一个原本干净的项目充满了依赖项和元数据

如果有人知道任何博客帖子、文章或书籍会让我感到充实,那就太棒了


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

这不是对你问题的直接回答,因为我不熟悉温莎城堡,我也不是IoC专家,但从我对java版Spring的经验来看,我可以告诉你这一点(我这里说的是春天,所以温莎城堡可能不是这样) 它不仅是依赖注入部分,而且是框架本身:声明式事务管理、内置安全框架、ORM支持、内置MVC web框架、RMI、web服务、电子邮件、AOP等,并且它与IoC进行了很好的集成,框架为mos做了很多工作这不是典型的情景

我认为,带有注释和IDE支持的自动连接(例如IntelliJ IDEA for Spring)可以缓解配置文件问题


我不知道除了IoC容器之外,castle windsor是否还有其他功能,但如果是的话,就其作为一个框架的丰富功能而言,它可能还不存在。

似乎你想要答案

显然,如果系统像你说的那样难以安装,那么在维护它时,它就没有多大价值了。这是使用新技术时要记住的一件重要事情。有时,由于这个因素,旧的无聊的东西要好得多

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

他们认为国际奥委会不适合小项目

另外,取决于尺寸和尺寸 项目的复杂性,国际奥委会 容器可能过度使用。希望 在大中型项目中使用它


我不一定认为IoC容器在所有情况下都是好的。但它肯定是好的。如果您使用依赖项注入或服务定位器来处理依赖项,您已经取得了很大的进步,但IoC容器可以帮助您自动完成任务,为您提供更高级场景的支持,等等

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

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

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

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

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

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

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

    -

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

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

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

更改要注入构造函数的依赖项并不一定意味着需要重构很多代码

通过一个源:装饰器、拦截器、代理以及处理对象生活方式,您可以从隧道依赖中获得各种好处。使用Windsor这样的容器,您可以用很少的资源完成一些非常简单的困难的事情