198

我是一名长期的 Windows 开发人员,对 win32 和早期的 COM 有过初步了解。自 2001 年以来,我一直在使用 .NET,因此我非常精通 C# 和 CLR。在我开始参加 Stack Overflow 之前,我从未听说过温莎城堡。我已经阅读了温莎城堡的“入门”指南,但没有点击。

教这条老狗新技巧,并告诉我为什么要将 Castle Windsor 集成到我的企业应用程序中。

4

5 回答 5

373

Castle Windsor 是一种反转控制工具。还有其他人喜欢它。

它可以为您提供具有预构建和预连接依赖项的对象。 通过反射和配置而不是“新”运算符创建的整个对象图。

从这里开始:http: //tech.groups.yahoo.com/group/altdotnet/message/10434


假设您有一个电子邮件发送课程。电子邮件发件人。假设您有另一个类 WorkflowStepper。在 WorkflowStepper 中,您需要使用 EmailSender。

你总是可以说new EmailSender().Send(emailMessage);

但这 - 使用new- 会产生难以改变的紧密耦合。(毕竟这是一个小小的人为的例子)

那么,如果不是在 WorkflowStepper 中新建这个坏男孩,而是将它传递给构造函数呢?

因此,无论谁调用它,都必须更新 EmailSender。

new WorkflowStepper(emailSender).Step()

想象一下,您有数百个只有一个职责的小类(google SRP)..您在 WorkflowStepper 中使用了其中的一些:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

想象一下,不用担心EmailSender写作时的细节WorkflowStepperAlertRegistry

你只是担心你正在处理的问题。

想象一下整个对象和依赖关系图(树)在运行时连接起来,所以当你这样做时:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

您可以真正处理WorkflowStepper在需要它们的地方自动填充的所有依赖项。

没有new

它只是发生了——因为它知道什么需要什么。

您可以使用设计更好的 DRY 代码以可测试和可重复的方式编写更少的缺陷。

于 2008-09-24T01:31:16.417 回答
4

Mark Seemann 写了一本关于 DI(依赖注入)的优秀书籍,它是 IOC 的一个子集。他还比较了一些容器。我不能足够推荐这本书。书名是:《.Net 中的依赖注入》https://www.manning.com/books/dependency-injection-in-dot-net

于 2016-08-11T13:00:28.233 回答
3

我认为 IoC 是朝着提高生产力和开发团队(包括 PM、BA 和 BO)的乐趣的正确方向迈进的垫脚石。它有助于在开发人员和测试之间建立关注点分离。它在架构设计时让您高枕无忧,因为框架可能进出灵活。

实现 IoC(CW 或 Ninject 等)目标的最佳方法是消除政治 #1 和 #2,从而消除开发人员在开发时伪装错误理解的需要。这两个解决方案似乎与 IoC 无关?他们是 :)

于 2015-02-18T18:46:09.450 回答
3

Castle Windsor 是Dependency Injection container.这意味着您可以在此帮助下注入您的依赖项并使用它们,而无需借助 new 关键字创建它们。例如,假设您编写了一个存储库或服务,并且希望在许多地方使用它,您需要先注册您的服务/存储库,然后将其注入所需的位置后即可开始使用。你可以看看下面我学习城堡温莎的教程。

链接

希望它会帮助你。

于 2017-03-07T18:07:37.787 回答
1

简单地说。想象一下,你的代码中有一些类,需要一些简单的配置值来完成它的工作。这意味着创建该类的实例的所有内容都需要获取这些依赖项,因此您通常最终不得不重构类加载,只需将一些配置传递到创建实例的位置。

所以要么大量的类被不必要地改变,你将配置值集中到一个大的配置类中,这也很糟糕......或者最糟糕的是仍然去服务定位器!

IoC 允许您的类轻松获得所有依赖项,并更明确地管理实例的生命周期。

于 2019-03-22T12:17:02.243 回答