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

时间:2008-11-19 19:40:07

标签: castle-windsor ioc-container

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

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

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

那就是说,我接受这样的可能性,即我在无知中使用所有这些观察/陈述,因为我从来没有大量参与使用Windsor或其他IoC容器的项目图书馆。我真正需要的是有人展示一个“平均”或“典型”的项目,其中使用了IoC容器库以及为什么这应该是一个“最佳实践”,对我来说,似乎它使一个干净的项目凌乱具有依赖性和元数据。

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

(我不是在为争论而争论,而是因为我真的希望接受教育,我是否应该自学IoC容器。)

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

好像你想要答案this question

显然,如果系统像你说的那样难以设置,那么当你来维护它时它不会有多大价值。使用新技术时要记住这一点很重要。有时因为这个因素,旧的无聊的东西更好。

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

他们认为IoC不适合小型项目,{/ 3>

  

另外,根据尺寸和   项目的复杂性,IoC   容器可能有点矫枉过正。较喜欢   在大中型项目中使用它。

答案 2 :(得分:1)

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

我试着在很久以前的博客文章中为自己定义它:

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

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

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

  • 智能,因为它了解您拥有的依赖项,并以递归方式为您创建它们。

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

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

    -

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

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

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

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

通过一个源获得隧道依赖的各种好处:装饰器,拦截器,代理,以及处理对象生活方式。使用像Windsor这样的容器,这可以让你做一些非常简单的事情,只需很少的耦合

您可以将其设施概念简化为与NHibernate

等平滑集成

答案 3 :(得分:0)

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

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

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