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

Dav*_*ill 187 c# dependency-injection castle-windsor inversion-of-control

我是一名长期的Windows开发人员,在win32和早期的COM上已经开始了.我从2001年开始使用.Net,因此我对C#和CLR非常流利.在我开始参与Stack Overflow之前,我从未听说过Castle Windsor.我已经读过温莎城堡"入门"指南,但它没有点击.

教这个老狗的新技巧,并告诉我为什么我应该将Castle Windsor整合到我的企业应用程序中.

Mat*_*nze 352

温莎城堡是一种控制工具的倒置.还有其他人喜欢它.

它可以为您提供具有预构建和预先连线依赖性的对象. 通过反射和配置而不是"新"运算符创建的整个对象图.

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


想象一下,你有一个发送课程的电子邮件.EmailSender.想象一下,你有另一个类WorkflowStepper.在WorkflowStepper内部,您需要使用EmailSender.

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

但是 - 使用new- 创造了一个难以改变的紧密耦合.(毕竟这是一个很小的人为的例子)

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

因此,无论谁调用它都必须重新启动EmailSender.

new WorkflowStepper(emailSender).Step()

想象一下,你有数百个这样的小类只有一个责任(谷歌SRP)..你在WorkflowStepper中使用了一些:

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

试想一下,没有担心的细节EmailSender时,你正在写WorkflowStepperAlertRegistry

您只是担心您正在处理的问题.

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

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

您可以真正处理WorkflowStepper所有依赖项,并自动填充您需要它们的位置.

没有 new

它恰好发生 - 因为它知道什么需要什么.

并且您可以通过可测试且可重复的方式使用设计更好的DRY代码来编写更少的缺陷.

  • 真棒!写得好!现在我很兴奋. (29认同)
  • 并帮助Java人员:这是Guice for .NET ;-) (5认同)
  • 我发现根据我的经验,调试起来比较困难,因为对象初始化在哪里? - 在大型项目中很难找到初始化的根.我更喜欢使用'new`的老式方法,我知道那时候的一切都在哪里.我也不喜欢使用反射的想法,它实际上是一个黑盒子,我们不拥有的代码,因此不完全理解. (5认同)
  • 谢谢。还有很多事情要做。我选择了一个非常简单而痛苦的具体例子。您可以使用接口来切换实现。您可以自动配置整个程序集。您可以指定生命周期,如单例或每个 http-request 等。继续前进 - 它会改变您的工作。 (2认同)