2011-12-20 47 views
2

我正在阅读文档,并看到如果您不使用接口,则Windsor只能截取虚拟方法?Windsor为什么只能截取虚拟或接口方法?

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

+0

我对这项技术也很陌生。刚刚陷入这个错误,并没有使虚拟方法成为现实。 – 2012-04-24 14:41:47

回答

4

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

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

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

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

+0

你是对的,温莎Intercepor是动态代理:http://kozmic.pl/dynamic-proxy-tutorial/ – Crixo 2011-12-29 14:36:29

+0

Acutally -1。对于设计良好的代码,IL过度使用也是标准的......当我设计一个API(坏的实践)时,我不能让我的类打开子类化,只是因为一个嘲讽工具太愚蠢而无法处理好密封的类。 – TomTom 2012-01-09 07:04:08

+0

不知道为什么你的答案仍未标记。 – 2012-04-24 14:43:45

2

既没有也没有。 Windsor通过子类工作,并且只能合理地覆盖虚拟方法 - 或者可以实现接口。

其他任何事情都需要调试器/探查器挂钩处于活动状态,这很难做 - 有些嘲讽框架支持,尽管它们都不是免费的。

+0

我认为微软鼹鼠是免费的,可以做到这一点。但我自己并没有尝试过。 – CodesInChaos 2012-04-24 14:51:34

+0

痣已退休。它现在被称为“Fakes”,是Visual Studio 11的一部分;)http://research.microsoft.com/en-us/projects/moles/ – TomTom 2012-04-25 17:36:52

2

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

+0

-1。这是嘲笑方面劣势技术的限制。相当一些商业框架做对了。 – TomTom 2012-01-09 07:04:32

+0

@TomTom你可以命名这样做的框架,我想检查它们,谢谢 – 2012-01-09 09:05:59

+0

Telerik JustMock有两种模式 - 一种通过代理,一种通过IL替换。它也不是很昂贵。还有一台,但每台机器2500美元 - 包括构建服务器。 – TomTom 2012-01-09 09:16:04

-2

是的,你需要虚拟的,但这只是因为微软已经搞砸了这种行为,如果你看Java的方法默认情况下打开扩展,你必须明确标记为密封。

阅读更多关于SOLID原则,特别是Open Closed Principle。

+0

-1。那么如何在Java中对selaed方法进行子类化?停止宗教战争 - 在测试模拟密封方法和良好框架支持这一点时,有很好的理由。 – TomTom 2012-01-09 07:05:12

+0

TomTom并不是一件宗教性的事情,如果它支持代码编织,所有的代码都会很棒,我只是表示,如果你不想,可以在你的代码中遵循开放的封闭原则,这是一个很好的习惯。我的客人:) – Nexus 2012-01-09 09:53:14

+0

当然。只是为了方便单元测试而违反项目要求(封闭的API),这是严格嘲讽框架的限制。好的甚至可以用另一个类替换一个类中的NEW构造。 – TomTom 2012-01-09 11:44:54

相关问题