.NET 5.0环境下Dependency Injection与Interception实现方案咨询
.NET 5 非ASP.NET Core场景DI+拦截的替代方案及建议
首先如果当前Unity的运行没有兼容性问题、现有业务代码改动成本较高,完全可以继续使用:Unity官方已经支持.NET Standard 2.0+,全兼容.NET 5及更高版本,跨Linux环境运行没有问题。如果要迁移到更贴合.NET 5+生态的实现,可以参考以下方案:
方案1:微软官方DI + Castle.Core 动态代理(最主流替代方案)
这是非ASP.NET Core场景下实现拦截的通用方案,Castle.Core作为业界成熟的动态代理组件,是大量.NET AOP框架的底层依赖,完全无平台绑定:
- 首先安装所需NuGet包:
Microsoft.Extensions.DependencyInjection、Castle.Core - 自定义拦截器实现
IInterceptor接口:
public class CustomInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { // 方法执行前逻辑 Console.WriteLine($"执行前:{invocation.Method.Name}"); // 调用原方法 invocation.Proceed(); // 方法执行后逻辑 Console.WriteLine($"执行后:{invocation.Method.Name}"); } }
- 服务注册时代理包装目标实现即可,完全不依赖ASP.NET Core相关组件:
var services = new ServiceCollection(); // 注册拦截器 services.AddSingleton<CustomInterceptor>(); // 注册带拦截的业务服务 services.AddScoped<IMyBusinessService>(sp => { var targetImpl = new MyBusinessServiceImpl(); var interceptor = sp.GetRequiredService<CustomInterceptor>(); var proxyGenerator = new ProxyGenerator(); return proxyGenerator.CreateInterfaceProxyWithTarget<IMyBusinessService>(targetImpl, interceptor); }); // 构建DI容器 var serviceProvider = services.BuildServiceProvider();
该方案优势:完全适配微软官方DI生态,性能优于旧版Unity的拦截实现,支持接口代理、类代理等多种拦截模式,跨平台稳定性高
方案2:使用开箱即用的DI+AOP集成类库
如果不想自行封装Castle的代理逻辑,可以选择成熟的集成类库:
Autofac:功能完备的第三方DI容器,内置拦截集成能力,兼容.NET 5+全场景,旧Unity用户上手门槛极低,支持命名注入、属性注入、子容器等Unity常用的高级特性AspectCore:原生为.NET Core/.NET 5设计的轻量级AOP框架,直接适配官方DI,性能优于Castle实现,天然支持异步拦截、属性注入等常用特性
选型建议
- 现有Unity代码量大、无明显性能/兼容性问题的场景,无需强行更换
- 要迁移到官方DI栈的场景,优先选择官方DI + Castle.Core动态代理的组合,生态最成熟,踩坑概率低
- 需要用到高级DI特性的场景,直接迁移到Autofac,拦截能力开箱即用,迁移成本很低
- 对性能要求极高的场景,可选择AspectCore框架
内容的提问来源于stack exchange,提问作者Abhishek Jain
相关产品推荐
相关产品推荐

