建议:将 Castle.DynamicProxy 依赖项与 ABP 分离

作者: neominky创建于 2026年6月30日更新于 2026年7月1日

大家好,我想讨论将Castle Windsor / Castle.DynamicProxy依赖项从 ABP 中分离出来的问题。我的长期目标是使 ABP 与NativeAOT兼容。以下是我认为值得考虑的几个原因: * Castle 与其他 IoC 相比具有性能开销。 * Castle 不再被积极维护。 * 它无法与现代技术(如 .NET Aspire)进行清晰整合。 * 依赖运行时代理生成时,NativeAOT 兼容性非常困难。我知道此主题之前已经提出过: https://GitHub.com/aspnetboilerplate/aspnetboilerplate/issues/5604## 当前进展 作为概念验证,我成功将依赖 Castle.DynamicProxy 的内置拦截器分离到名为 Abp.Interception.Castle 的单独包中。而不是将所有拦截器实现都移动(这会重复代码并使维护困难),我只将注册器类(例如 AuthorizationInterceptorRegistrar)移动。这使得内置拦截器实现可以保持共享,而只将 Castle 特定的注册逻辑放在新包中。为了实现这一点,我引入了名为 IAbpInvocation 的新抽象,它替换了 Castle.DynamicProxy.IInvocation。## 拦截器实现 而不是使用运行时代理生成,我使用 C# 源代码生成器 实现了拦截。生成的代码在编译时将拦截器管线直接注入目标类中。虽然有一个更简单的实现,但我故意选择了更复杂的内部实现,以尽可能保持源代码级别的兼容性。## 兼容性 好消息是,现有的大多数拦截器实现仍然可以正常工作。在大多数情况下,唯一需要的更改是替换: Castle.DynamicProxy.IInvocationIAbpInvocation。所需的更改是最小的:diff-public void Intercept(IInvocation invocation) + public void Intercept(IAbpInvocation invocation)您可以在以下链接中查看实际更改:替换 IInvocationIAbpInvocation 的差异 然而,由于主 ABP 包将不再暴露 Castle.DynamicProxy.IInvocation,这仍然是一个突变。我认为还应该可以提供一个源代码生成器(尚未实现),它自动重写 IInvocation 引用为 IAbpInvocation,从而最大限度地减少迁移工作量。此外,可能还需要启动扩展,例如 UseCastle(),以启用基于 Castle 的实现。我仍在考虑最佳设计方案。## 问题 我想听听你的想法。你是否支持以下方向? * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖项从 ABP 中分离出来 * 将 Castle.DynamicProxy 依赖

内容来源: aspnetboilerplate/aspnetboilerplate