为什么Windsor只能拦截虚拟或接口方法?

时间:2011-12-20 13:47:54

标签: c# castle-windsor interceptor

我正在阅读文档,看看如果你不使用界面,那么Windsor只能拦截虚拟方法?

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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

其他任何事情都需要调试器/探查器钩子活动,这很难做 - 一些模拟框架支持,ti,虽然它们都不是免费的。

答案 2 :(得分:2)

这是.NET框架的限制。 Windsor生成动态实现,可以实现接口或覆盖虚拟成员。 .NET不允许覆盖非虚拟成员。

答案 3 :(得分:-2)

是的,你需要虚拟,但这只是因为微软搞砸了这种行为,如果你看一下Java,默认情况下一个方法是开放的,你必须明确地将其标记为密封。

详细了解SOLID原则,特别是开放封闭原则。