【问题标题】:Inversion of Control with .net.net 控制反转
【发布时间】:2010-09-20 00:15:08
【问题描述】:

我很少听到有人在.Net 中使用Inversion of Control (Ioc) 原则。我有一些使用 Java 的朋友,他们在 Spring 和 PicoContainer 中使用了更多的 Ioc。

我了解从您的代码中删除依赖项的原则......但我怀疑它是否更好。

.Net 程序员为什么不使用(或少用)那些类型的框架?如果这样做,从长远来看,你真的发现了积极的影响吗?

【问题讨论】:

  • 只要谷歌“Alt.net”——你会发现很多人在 .net 中使用 IOC。微软甚至有自己的 IOC 框架,例如 Unity。

标签: c# .net dependency-injection inversion-of-control


【解决方案1】:

很多人在 .NET 中使用 IOC,并且有几个框架可以帮助使用 IoC。您可能在 WinForms 方面看到的较少,因为当您在 Visual Studio 中设计表单时,让容器将所有内容连接在一起更难,但我可以说对于服务器端 .NET 应用程序,我至少在那里工作,IoC使用非常成功。

为什么在 .NET 中使用它?出于同样的原因,您在其他任何地方都使用它。我最喜欢的两件事是:

  • 为 IoC 设计倾向于强制执行良好的编码实践 - 设计为接口、低耦合、高内聚。这也导致类非常容易进行单元测试。
  • 通常无需重新编译即可更改系统配置。

其他一些讨论可用于 .NET 的不同 IoC/DI 框架的帖子:

【讨论】:

    【解决方案2】:

    我使用StructureMap 进行依赖注入,最近才开始使用它和iBATIS.NET 在运行时注入我们的域对象映射器(不是通过 XML 配置文件,不,谢谢!) .

    我已经看到了立竿见影的好处。为我们所有的映射器(例如IPersonMapper)创建接口,然后添加Moq,让我可以快速轻松地编写一些非常棒的无数据库单元测试。

    以前(.NET 1.0)我写了自己的插件系统,主要是为了学习反射。从那时起,我在我的项目中实施了某种 IoC。直到最近我才开始使用 IoC 来减少编写单元测试的痛苦。在这一点上,我无法想象有任何其他方式。

    【讨论】:

      【解决方案3】:

      直到现在,IoC 在 .Net 中还没有那么普遍。它与微软以及他们所做的促销活动有关。到目前为止,他们更强调 VS 的 RAD 功能,同时忘记了推广 IoC 和 Di 之类的东西,但现在他们有了自己的称为 Unity 的框架以及他们在 ASP.Net MVC 上所做的工作。

      所以我猜大多数人会开始使用这样的东西。因为知道他们可以使用 MS 替代品。

      我使用 StructureMap。

      【讨论】:

        【解决方案4】:

        它变得越来越普遍。我目前的项目使用 Spring,在我之前的项目中我们使用 Castle Windsor。

        现在我想使用“约定优于配置”的想法,以防止所有那些复杂的 XML 声明。

        【讨论】:

          【解决方案5】:

          关于 IoC .NET 的使用有很多理论。我认为有相当多的开发人员没有该领域的经验。他们并非来自 Java 背景。他们来自经典的 ASP 和 VB6 背景。此外,微软直到最近才真正推广使用 IoC。

          此外,使用 IoC 假设了几件事。首先,您必须了解它的用途以及从中得到什么。其次,您必须开发您的代码,以便实际使用 IoC 容器。

          IoC 不仅仅是使用工具箱中的另一个项目。这是关于知道如何使用,知道何时使用它以及作为开发人员成熟。

          因为它与 .NET 相关,所以我有几个 IoC 容器。我用过 Windsor、StructureMap、Unity,最近还用过 Ninject。但请记住,我还没有在实际应用程序中使用所有这些。我喜欢到处玩耍,看看外面发生了什么。我发现 IoC 容器 .NET 的市场相当不错。

          【讨论】:

            【解决方案6】:

            我用它来允许我的单元测试用 Mock Classes(模拟实际生产类)代替上游依赖对象,这样我的单元测试真正只执行和测试一个 class.method 中的代码,它们被编写来测试。

            【讨论】:

              【解决方案7】:

              试试 LinFu.IOC 2.0:

              http://www.codeproject.com/KB/cs/LinFu_IOC.aspx

              它是目前最灵活的 IOC 容器之一,并且与 Ninject 一样,无需维护 XML 文件。然而,与 Ninject 不同的是,LinFu 不会强迫您编写任何绑定代码来将您的依赖项连接在一起。看一看! :)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-07-31
                • 2011-04-11
                • 1970-01-01
                • 2011-07-06
                • 2014-05-03
                • 1970-01-01
                • 2015-03-21
                相关资源
                最近更新 更多