【问题标题】:Why can Windsor only intercept virtual or interfaced methods?为什么 Windsor 只能拦截虚拟或接口方法?
【发布时间】:2012-01-06 20:09:31
【问题描述】:

我在看文档,看到如果不使用接口那么Windsor只能拦截虚方法?

这是 Windsor 的限制还是仅仅是 C# 语言的限制?我正在寻找一个深入的答案。

【问题讨论】:

  • 我也是这项技术的新手。刚刚被这个错误抓住了,没有把方法变成虚拟的。

标签: c# castle-windsor interceptor


【解决方案1】:

C# 语言在这里完全无关紧要。问题是拦截在运行时级别是如何工作的。

一种技术是从类继承/实现接口并将其用作代理。这显然只能覆盖虚拟方法和接口方法。我怀疑温莎使用了这种技术。这种技术的优点是它不需要任何特殊的东西。只需在运行时创建一个类。

另一种方法是使用分析 API。这允许您修改任何方法的 IL,包括非虚拟方法。这更具侵入性,通常仅在测试遗留代码时使用。

另一种方法是在构建时使用 IL 重写。这可以在您编写的代码中添加拦截点,但不能在框架代码中添加。

【讨论】:

  • 你说得对,Windsor Intercepor 是动态代理:kozmic.pl/dynamic-proxy-tutorial
  • 实际上是-1。 IL overwiting 也是设计良好的代码的标准......在设计 API 时,我不能让我的类打开子类化(糟糕的编程实践),因为模拟工具太愚蠢而无法处理密封良好的类。
【解决方案2】:

这是 .NET 框架的限制。 Windsor 产生一个动态实现,它要么实现一个接口,要么覆盖一个虚拟成员。 .NET 不允许覆盖非虚拟成员。

【讨论】:

  • -1。这是对模拟方面劣质技术的限制。相当多的商业框架做得对。
  • @TomTom 你能说出能做到这一点的框架吗,我想看看,谢谢
  • Telerik JustMock 有两种模式 - 一种通过代理,一种通过 IL 替换。它也不是很贵。还有一个,但每台机器 2500 美元 - 包括构建服务器。
【解决方案3】:

也不是。 Windsor 通过子类化工作,您只能明智地覆盖虚拟方法 - 或者可以实现接口。

其他任何事情都需要激活调试器/分析器挂钩,而这很难做到 - 一些模拟框架支持,ti,尽管它们都不是免费的。

【讨论】:

  • 我认为 Microsoft Moles 是免费的并且可以做到这一点。但我自己没试过。
  • 摩尔已退役。它现在被称为“Fakes”并且是 Visual Studio 11 的一部分;)research.microsoft.com/en-us/projects/moles
【解决方案4】:

是的,您需要虚拟对象,但这只是因为 Microsoft 搞砸了这种行为,如果您以 Java 为例,默认情况下一个方法是开放的以进行扩展,您必须明确将其标记为密封。

阅读更多关于 SOLID 原则,特别是开放封闭原则的信息。

【讨论】:

  • -1。那么如何在 Java 中子类化一个 selaed 方法?停止宗教战争 - 在测试期间模拟密封方法有充分的理由,良好的框架支持这一点。
  • TomTom 不是宗教性的东西,是的,如果它支持代码编织一切都会很棒,我只是表示在你的代码中遵循开放封闭原则可能是一个好习惯,如果你不想,做我的客人:)
  • 当然。只是为了方便单元测试而违反项目要求(封闭的 API)是不良模拟框架的限制。好的甚至可以用另一个类替换一个类中的新结构。
  • @TomTom 你知道 windsor 不是一个模拟框架吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多