【问题标题】:Castle Windsor and Dynamic Wiring温莎城堡和动态布线
【发布时间】:2013-10-22 19:44:10
【问题描述】:

在过去的几年里,我一直是温莎的忠实用户。在使用 Fluent Registration API 之前,我会在 Xml 注册和大量 AddComponent() 代码之间切换。很长一段时间以来,我们一直在愉快地使用 Fluent Registration API 和 Installers。我从各种文章中得到了这样的印象:

http://docs.castleproject.org/Windsor.XML-Registration-Reference.ashx

Xml 注册方法已经失宠,如果它在不久的将来被标记为弃用,我也不会感到惊讶。

现在,对于我的问题:Fluent Registration API 和安装程序在自动装配场景(即,当我希望 Windsor 弄清楚如何构建我的对象图时)流畅地工作。自动布线是绝大多数 IoC 用例,但是当自动布线不可能时呢?换句话说,我有多个服务实现,我需要告诉 Windsor 如何构造我的对象图的各个部分。我已经用 Xml 注册方法做了很多次了,但是这些天有更首选的方法吗?我对采用 Xml 注册方法犹豫不决,因为它的未来似乎不确定,但我不知道如何通过 Windsor 实现这一目标。

我的用例是:

  • 系统需要能够在 QA 测试中交换实现(即 我们要测试的信用检查和欺诈检测处理 不依赖信用局 API)
  • 我们的提供者模式 我们需要有条件地打开和关闭不同的系统 在部署时实现。

这一切似乎都非常适合 IoC,我们已准备好所有构建模块,但我想确保我在 Windsor 中采用了最适合未来的方法。

更新: 虽然我喜欢功能切换方法,但我最近发现了一个在这方面非常有用的 Windsor 功能 - Fallback Components。我将这里的编辑留给以后可能偶然发现的任何人。

【问题讨论】:

  • 你能贴出你想模仿的xml配置吗?

标签: inversion-of-control castle-windsor


【解决方案1】:

完全通过 XML 配置您的 DI 容器容易出错、冗长且太痛苦。 XML 配置的可能性始终是您可以使用基于代码的配置所做的事情的一个子集;代码总是更具表现力。

虽然您的 DI 配置有时取决于部署时配置,但由于您需要的旋钮数量通常相当少,因此使用配置标志通常比使用完全限定的类型名称污染配置文件要好得多。

或者让我换种说法,当您在配置文件中放置大量 DI 配置时,因为您可能想在部署时更改它们,请三思。无论如何,许多更改都需要测试(由开发人员),因此您绝不希望您的运营团队中的某个人来摆弄它。而当您需要开发人员查看并验证它时,不必重新编译项目有什么好处?这实际上更快吗?无论如何,开发人员仍然必须启动应用程序。

这是一种虚假的灵活性,实际上是一种糟糕的界面设计(xml 是您的维护和运营部门的界面)。顺便说一句,您是需要记录如何更改配置文件的人吗? 与其描述在 xml 文件中间某处有效的完全限定类型名称的列表,不如只写“在此字段中放置 'false' 以禁用 ...”,这不是更容易吗? ?

以下是如何使用配置开关的示例:

bool detectFraught =
    ConfigurationManager.AppSettings["DetectFraud"] != "false";

container.Register(
    Component.For(typeof(IFraughtDetector)).ImplementedBy(
        detectFraught ? typeof(RealDectector) : typeof(FakeDetector));

看看配置开关现在如何只是一个布尔标志。这使得配置文件更易于维护,因为配置现在是一个简单的布尔开关,而不是完整的类型名称(可能拼写错误)。

当然,["DetectFraud"] != "false" 本身并不是很好,但这可以通过创建强类型配置助手来解决。

【讨论】:

  • 史蒂文-我同意。由于这个原因,我讨厌 xml 配置,但我们正在寻找解决这个问题的框架级别的东西。现实情况是,这是一个特定领域的问题,最好由我而不是框架来解决。无需将注册移动到配置文件中的所有复杂性,只需打开非常特定的配置开关以有条件地加载安装程序。看起来很简单 - 不知道为什么今天早上没有更明显:) 干杯。
【解决方案2】:

This answer 也可能会有所帮助。允许您在运行时动态地提供实现。不过,听起来您不需要那么动态地使用它,而且发生的事情也不太明显。

【讨论】:

  • Andy - 是的,我们目前正在使用选择器,这非常适合运行时条件。我认为斯蒂芬在下面所说的更适合我的问题。
【解决方案3】:

没有计划废弃或删除 Windsor 中的 XML 配置支持。

是的,你是对的,由于其众多缺点,它不是首选方法。

您可以在 XML 中做的任何事情都可以在代码中完成(注意逆向不正确)。

还请记住,XML 不是全有或全无。有很多方法可以实现您作为示例提供的场景,而无需借助 XML 中的注册。

  • 功能切换
  • 条件编译
  • installer 中的 if/else 基于 appSettings 标志
  • 其他...

我过去曾在不同的项目中使用过它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多