为什么Windsor只能拦截虚方法或接口方法?
本文关键字:方法 接口 Windsor 为什么 | 更新日期: 2023-09-27 18:18:28
我正在阅读文档,看到如果你不使用接口,那么温莎只能拦截虚拟方法?
这是Windsor的限制还是c#语言的限制?我在寻找一个深入的答案
c#语言在这里完全无关紧要。问题是如何在运行时级别进行拦截。
一种技术是从类继承/实现接口并将其用作代理。这显然只能覆盖虚方法和接口方法。我怀疑温莎使用了这种技术。这种技术的优点是它不需要任何特殊的东西。只需在运行时创建一个类。
另一种方法是使用分析API。这允许您修改任何方法的IL,包括非虚拟方法。这是更具侵入性的,通常只在测试遗留代码时使用。
另一种方法是在构建时使用IL重写。这可以在代码中添加拦截点,但不能在框架代码中添加。
这是。net框架的一个限制。Windsor生成一个动态实现,它要么实现一个接口,要么重写一个虚成员。. net不允许重写非虚成员。
都不是。Windsor通过子类化工作,你只能合理地覆盖虚方法——否则接口可以实现。
其他任何东西都需要激活调试器/分析器挂钩,这很难做到-一些mock框架支持,但没有一个是免费的。
是的,你需要虚拟,但那只是因为微软搞砸了这种行为,如果你看看Java,例如一个方法默认是开放的扩展,你必须显式地将其标记为密封。
阅读更多关于SOLID原则,特别是开闭原则