【问题标题】:How can I validate the configuration of windsor castle如何验证温莎城堡的配置
【发布时间】:2010-04-28 18:38:35
【问题描述】:

我想断言我的注册是有效的,即没有缺少依赖项并且没有循环依赖项。
我想在我的应用程序中(而不是在单元测试中)这样做,所以如果配置无效,我可以快速失败。
我还想在不解析(和实例化)所有组件的情况下实现这一点 - 仅通过扫描依赖关系图。
知道我该怎么做吗?

动机是配置复杂应用程序的反复试验性质。在容器配置错误的情况下,我希望获得快速失败的行为。

顺便说一句 - 我的灵感来自 AutoMapper 的 AssertConfigurationIsValid() 方法。

【问题讨论】:

  • 当我遇到一个我不知道的术语时,我会问我的朋友 Google。我用“温莎城堡”做到了这一点,我得到的只是他们女王的英国城堡住所。我敢打赌你说的不是这个,所以请赐教。
  • Jay,也许如果你检查了与这个标签相同的其他问题,就会为你提供答案......
  • Jay - Windsor 是 Castle 项目中控制容器的反转。查看castleproject.org

标签: validation configuration inversion-of-control castle-windsor ioc-container


【解决方案1】:

您无法 100% 确定,因为温莎是一个动态的有机体,并非所有事物都可以静态分析。所有处理程序可能处于 WaitingDependency 状态,但您的应用程序可能 100% 工作,因为在解决时,依赖项将由 DynamicParametersISubDependencyResolvers 或 ILazyComponentLoaders 提供。

计划将您提到的此功能包含在 Windsor 中,但鉴于上述限制,它几乎不会提供任何价值。

我建议制定良好、可靠的可验证约定来决定哪些内容进入容器,哪些不进入,以及通过解析组件来测试容器的良好单元测试。

如果您不介意得到误报,您可以执行以下操作:

var allHandlers = container.Kernel.GetAssignableHandlers(typeof(object));

然后遍历它们并检查它们是否都是Valid,但我宁愿为此进行专门的测试。 Take a look at this post for example.

配置应用程序不必反复试验,也不应该如此。这是一个良好的约定,并坚持下去。我有两篇关于它的帖子,您可能会觉得有用:

【讨论】:

  • 动机当然是配置复杂应用程序的反复试验性质。如果容器配置错误,我更愿意获得快速失败的行为。也许您可以提供一种三态验证方法,该方法将返回有效、无效或不确定的结果?我很少使用 Windsor 的动态特性,而且我相信大多数时候我的错误配置可以及早发现。
  • “配置应用程序不必反复试验,也不应该如此。”即使不是这样,Windsor 似乎只是返回null,而不是在构造对象出现问题时实际抛出错误,这使得它非常难以理解出了什么事。这发生在我身上,例如,当无法建立数据库连接时;我的应用程序在很久以后就以NullReferenceException 爆炸,而不是关于无法连接的有用消息。
猜你喜欢
  • 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
相关资源
最近更新 更多