什么是温莎城堡,为什么我要关心?


190

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

教这只老狗新的花样,并告诉我为什么我应该将Castle Windsor集成到我的企业应用程序中。


1
阅读有关控制反转的信息。这对于帮助您解耦依赖关系非常有用,对于初学者来说,这将极大地帮助您编写单元测试。
Dan Csharpster

Answers:


358

温莎城堡是控制工具的一种反转。还有其他喜欢它的人。

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

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


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

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

但是-使用new-会创建很难更改的紧密耦合。(毕竟这是一个很小的人为的例子)

那么,如果您只是将它传递到构造函数中,而不是在WorkflowStepper中更新这个坏男孩怎么办?

因此,无论谁打电话给它,都必须重新安装EmailSender。

new WorkflowStepper(emailSender).Step()

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

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

想象一下,不用担心EmailSender写作WorkflowStepper或写作时的细节。AlertRegistry

您只需要担心正在处理的问题。

想象一下,对象和依赖关系的整个图(树)在运行时连接起来,因此当您执行以下操作时:

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

您可以WorkflowStepper在需要的地方自动填写所有依赖项,从而真正解决问题。

没有 new

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

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


30
真棒!写得好!现在,我对此感到兴奋。
David Hill

1
谢谢。还有很多。我选择了一个非常简单且痛苦的示例。您可以使用界面来切换实现。您可以自动配置整个程序集。您可以指定生命周期,例如单例或按http请求的生命周期等。请继续-它将改变您的工作。
马特·欣兹

6
并帮助Java开发人员:这是.NET的Guice ;-)
Mark Renouf

5
我发现根据我的经验,调试起来比较困难,因为对象在哪里初始化?-在大型项目中,很难找到初始化的根源。我更喜欢老式的使用方式new,我知道那时一切都在哪里。我也不喜欢使用反射的想法,它实际上是一个黑匣子,我们不拥有代码,因此无法完全理解。
Luke

1
@nashwan是的,我正在编写单元测试,但是IoC / DI的原理可以在没有Castle Windsor或任何第三方框架的情况下应用,这对我来说只是增加了另一个依赖关系,这就是我的评论的重点。我只是看不到温莎城堡的优势。
卢克·奥布莱恩


3

我认为,IoC是朝着提高生产率和享受开发团队(包括PM,BA和BO)的乐趣的正确方向迈出的一步。它有助于在开发人员和测试人员之间建立关注点分离。当进行架构设计时,它使您放心,这允许灵活性,因为框架可以进出。

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


3

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

链接

希望对您有帮助。


1

简单地说。想象一下,您的代码中埋藏了一些类,需要一些简单的配置值来完成其工作。这意味着创建该类实例的所有内容都需要获得这些依赖关系,因此您通常最终不得不重构类的负载,以仅将一些配置传递给实例的创建位置。

因此,要么不必要地更改了许多类,要么将配置值捆绑到一个大的配置类中,这也很糟糕……或者最糟糕的还是去服务定位器!

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.