You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:24:02