.net core三种依赖注入方式,原生的依赖注入器,scrutor,autofac

在 .NET Core 中,依赖注入(DI)是一个核心特性,它允许你管理应用程序中对象的生命周期和依赖关系。默认情况下,.NET Core 提供了一个内置的 DI 容器,但你也可以选择扩展它,或者使用第三方 DI 框架,如 ScrutorAutofac。下面我将介绍这三种方式的优缺点,并帮助你了解它们各自的特点。

1. 原生 .NET Core 依赖注入容器

.NET Core 默认提供了一个轻量级的依赖注入容器,通常称为 Microsoft.Extensions.DependencyInjection。这是一个开箱即用的解决方案,适用于大多数简单和中等复杂度的应用程序。

主要特点
  • 内置支持 :不需要安装任何额外的库,直接使用 ASP.NET Core 项目就可以。
  • 简单易用:依赖注入 API 非常简洁,适合基本的 DI 使用场景。
  • 支持基本生命周期 :支持 TransientScopedSingleton 三种生命周期管理方式。
  • 有限的功能:不支持一些高级特性,例如条件注册、自动注册、按约定扫描类等。
使用示例
cs 复制代码
public void ConfigureServices(IServiceCollection services) {     
    services.AddTransient<IServiceA, ServiceA>(); // Transient生命周期         
    services.AddScoped<IServiceB, ServiceB>(); // Scoped生命周期 
    services.AddSingleton<IServiceC, ServiceC>(); // Singleton生命周期 
}

优点

  • 集成度高 :与 ASP.NET Core 等框架高度集成。
  • 性能:由于它是一个轻量级容器,所以性能较好。
  • 学习曲线低:不需要额外学习和配置,适合大多数常见场景。
缺点
  • 功能有限:不支持像自动扫描、按约定注册等高级功能,且 API 较为基础。
  • 扩展性较差:如果需要更多的高级特性,可能需要自己实现很多功能,或者引入第三方库。

2. 原生 .NET Core 依赖注入容器 + Scrutor

Scrutor 是一个开源库,用来扩展 .NET Core 内置的 DI 容器,提供自动注册、按约定扫描类、条件注册等功能。它使得在使用原生依赖注入容器的基础上,能够享受更多的自动化和灵活性。

主要特点
  • 自动扫描和注册:Scrutor 支持自动扫描程序集和按命名空间、类后缀等约定进行注册,减少了手动注册的工作量。
  • 灵活的服务注册:可以根据不同的条件动态地注册服务(例如,根据配置或环境来选择服务)。
  • 更丰富的功能:可以链式调用和自定义注册行为,例如,按类名后缀注册或为服务添加拦截器。
使用示例
cs 复制代码
public void ConfigureServices(IServiceCollection services) { 
    services.Scan(scan => scan .FromAssemblyOf<Startup>() // 扫描程序集 
    .AddClasses(classes => classes.InNamespaceOf<Startup>()) // 按照命名空间选择类 
    .AsImplementedInterfaces() // 注册为实现的接口 
    .WithTransientLifetime()); // 使用Transient生命周期 
}
优点
  • 自动化:自动注册类和接口,避免了冗长的手动注册过程,尤其适合大型项目。
  • 灵活性强:支持按约定、条件和规则进行注册,可以更高效地管理服务。
  • 可扩展性:为原生容器添加了很多功能,使得开发人员可以更灵活地配置依赖注入。
缺点
  • 引入额外的库:需要额外添加 Scrutor 库。
  • 可能对性能有小影响:自动扫描和注册会带来一些性能开销,尤其是在大型应用中。

3. 使用 Autofac

Autofac 是一个流行的第三方依赖注入框架,提供了比 .NET Core 内置容器更丰富的功能。它支持复杂的服务生命周期、条件注册、模块化注册等高级功能,是 .NET Core 开发中常用的第三方 DI 框架之一。

主要特点
  • 高级功能:如条件注入、属性注入、模块化注册、依赖关系解析的粒度更细等,适合更复杂的场景。
  • 扩展性和灵活性 :提供丰富的扩展机制,可以按需求调整 DI 行为,例如通过 Module 来批量注册服务,或者实现自己的 IServiceProvider
  • 性能优化:对于大规模应用,Autofac 的性能和管理能力较好,能够提供更多的控制和优化。
使用示例
cs 复制代码
public void ConfigureServices(IServiceCollection services) { 
    var builder = new ContainerBuilder(); 
    // 注册服务 
    builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerDependency(); // Transient生命周期 
    builder.RegisterType<ServiceB>().As<IServiceB>().SingleInstance(); // Singleton生命周期 
    
    // 将现有服务添加到 Autofac 容器中 
    builder.Populate(services);  

    // 构建容器并使用它 
    var container = builder.Build(); 
    return new AutofacServiceProvider(container); 
}
优点
  • 丰富的功能:支持条件注入、属性注入、动态服务生成、模块化注册等复杂场景。
  • 扩展性强:提供了许多自定义钩子和扩展点,可以非常灵活地定制 DI 行为。
  • 性能:对于复杂的应用,Autofac 提供了更好的性能优化和服务管理能力。
缺点
  • 学习曲线较陡:相比原生的依赖注入容器,Autofac 提供了更多的配置和扩展选项,可能需要更多时间来学习和掌握。
  • 额外依赖:需要引入第三方库(Autofac),增加项目的复杂度。

总结与对比

特性 原生 .NET Core DI 原生 DI + Scrutor Autofac
学习曲线 中等
功能 基本 增强(自动扫描、按约定) 强大(条件注入、模块化注册等)
性能 最优 略低 优化良好,适用于复杂场景
扩展性 较差 中等 非常强
易用性 中等 中等
适用场景 小型/中型项目 中型项目,服务较多时 大型、复杂的应用
  • 原生 .NET Core DI 适用于小型应用和中型应用,尤其是在功能需求相对简单时。
  • 原生 DI + Scrutor 适合中型到大型应用,尤其是当需要自动扫描、按约定注册和灵活配置时。
  • Autofac 适合大型、复杂的应用,特别是需要更多自定义和灵活性的场景。

根据你的项目规模、需求复杂度和团队的经验,选择适合的依赖注入方式是很重要的。

相关推荐
哑巴语天雨4 小时前
前端面试-网络协议篇
websocket·网络协议·http·面试·https
ktkiko115 小时前
Websocket——心跳检测
网络·websocket·网络协议
小梁不秃捏7 小时前
HTTP 常见状态码技术解析(应用层)
网络·网络协议·计算机网络·http
yourkin6668 小时前
HTTPS(下)
服务器·网络协议·https
卑微的小鬼9 小时前
rpc和http的区别,为啥golang使用grpc 不使用http?
http·rpc·golang
元气满满的热码式9 小时前
logstash中的input插件(http插件,graphite插件)
网络·网络协议·http·elasticsearch·云原生
豪宇刘12 小时前
从三个维度了解 RPC(Remote Procedure Call,远程过程调用)
网络·网络协议·rpc
人工干智能18 小时前
科普:你的笔记本电脑中有三个IP:127.0.0.1、无线网 IP 和局域网 IP;两个域名:localhost和host.docker.internal
网络协议·tcp/ip·电脑
shepherd枸杞泡茶19 小时前
第3章 3.3日志 .NET Core日志 NLog使用教程
c#·asp.net·.net·.netcore
csdn_aspnet19 小时前
ASP.NET Core 简单文件上传
asp.net·.netcore