【发布时间】:2012-01-06 20:09:31
【问题描述】:
我在看文档,看到如果不使用接口那么Windsor只能拦截虚方法?
这是 Windsor 的限制还是仅仅是 C# 语言的限制?我正在寻找一个深入的答案。
【问题讨论】:
-
我也是这项技术的新手。刚刚被这个错误抓住了,没有把方法变成虚拟的。
标签: c# castle-windsor interceptor
我在看文档,看到如果不使用接口那么Windsor只能拦截虚方法?
这是 Windsor 的限制还是仅仅是 C# 语言的限制?我正在寻找一个深入的答案。
【问题讨论】:
标签: c# castle-windsor interceptor
C# 语言在这里完全无关紧要。问题是拦截在运行时级别是如何工作的。
一种技术是从类继承/实现接口并将其用作代理。这显然只能覆盖虚拟方法和接口方法。我怀疑温莎使用了这种技术。这种技术的优点是它不需要任何特殊的东西。只需在运行时创建一个类。
另一种方法是使用分析 API。这允许您修改任何方法的 IL,包括非虚拟方法。这更具侵入性,通常仅在测试遗留代码时使用。
另一种方法是在构建时使用 IL 重写。这可以在您编写的代码中添加拦截点,但不能在框架代码中添加。
【讨论】:
这是 .NET 框架的限制。 Windsor 产生一个动态实现,它要么实现一个接口,要么覆盖一个虚拟成员。 .NET 不允许覆盖非虚拟成员。
【讨论】:
也不是。 Windsor 通过子类化工作,您只能明智地覆盖虚拟方法 - 或者可以实现接口。
其他任何事情都需要激活调试器/分析器挂钩,而这很难做到 - 一些模拟框架支持,ti,尽管它们都不是免费的。
【讨论】:
是的,您需要虚拟对象,但这只是因为 Microsoft 搞砸了这种行为,如果您以 Java 为例,默认情况下一个方法是开放的以进行扩展,您必须明确将其标记为密封。
阅读更多关于 SOLID 原则,特别是开放封闭原则的信息。
【讨论】: