news 2026/10/23 2:07:35

.NET 自动依赖注入神器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET 自动依赖注入神器

目录

什么是 Injectio?

安装

基础用法

1️⃣ 创建接口和实现类

2️⃣ 在入口程序中调用 Injectio

方法注册

注册特性(Attributes)

特性可选属性

重复注册策略

注册策略

示例

单例服务

作用域服务

瞬态服务

工厂注册

开放泛型(Open Generic)

泛型特性(需 .NET 7.0+)

Keyed 服务(需 Microsoft.Extensions.DependencyInjection 8.0+)

添加到容器

注册标签(Tags)

💡 总结


在 .NET Core/Web 项目中,手动写一堆services.AddScoped<...>、AddSingleton<...>是否让你头大?今天给大家介绍一个神器——Injectio,帮你自动扫描并注册服务,减少重复代码,让你的依赖注入(DI)更加优雅。

什么是 Injectio?

Injectio是一个自动服务注册库,通过约定(Convention)+ 特性(Attribute)自动扫描并注册依赖服务。

简单理解:

  • •不用手动注册服务

  • •支持 Singleton / Scoped / Transient

  • •支持工厂方法、模块注册、泛型和 Keyed 服务

适用于.NET 6/7/8 Web 或控制台项目。


安装

dotnet add package Injectio

或者添加到.csproj文件中

<PackageReference Include="Injectio" PrivateAssets="all" />

PrivateAssets="all"表示这个包不会被依赖它的项目引用。


基础用法

1️⃣ 创建接口和实现类

public interfaceIMessageService { string Send(string message); } [RegisterSingleton] // 自动注册为单例 publicclassEmailMessageService : IMessageService { public string Send(string message) { Console.WriteLine($"Email sent: {message}"); return message; } }

2️⃣ 在入口程序中调用 Injectio

对于 .NET 6/7/8 最小 API:

using Injectio; var builder = WebApplication.CreateBuilder(args); // 👈 自动注册项目中的服务(自动生成的)类,可以看截图 builder.Services.AddInjectioDemo(); var app = builder.Build(); app.MapGet("/", (IMessageService messageService) => { messageService.Send("Hello from Injectio!"); return"Message sent!"; }); app.Run();

或者在控制器中使用

[ApiController] [Route("[controller]/[action]")] publicclassWeatherForecastController : ControllerBase { privatereadonly IMessageService _myService; public WeatherForecastController(IMessageService myService) { _myService = myService; } [HttpGet(Name = "GetWeatherForecast2")] public string Get2() { return _myService.Send("Hello from WeatherForecastController!"); } }

这样就不用再写services.AddScoped<IMessageService, EmailMessageService>()了!

方法注册

public class RegistrationModule { [RegisterServices] public static void Register(IServiceCollection services) { services .AddOptions<PollingOption>() .Configure<IConfiguration>((settings, configuration) => configuration.GetSection(PollingOption.SectionName).Bind(settings) ); } }

image


注册特性(Attributes)

在类上添加注册特性,源生成器会自动发现并注册服务。

特性

说明

[RegisterSingleton]

标记为单例服务

[RegisterScoped]

标记为作用域服务

[RegisterTransient]

标记为瞬态服务

[RegisterServices]

标记方法,用于注册服务

特性可选属性

  • •ServiceType:指定注册接口

  • •ImplementationType:指定实现类型

  • •Factory:使用工厂方法创建实例

  • •Duplicate:重复注册策略(Skip / Replace / Append)

  • •Registration:注册策略(Self / ImplementedInterfaces / SelfWithInterfaces)

重复注册策略

  • •Skip:已存在的服务跳过注册

  • •Replace:替换已有的服务注册

  • •Append:在已有服务后追加注册

注册策略

  • •Self:将具体类型注册为自身

  • •ImplementedInterfaces:注册为其实现的接口

  • •SelfWithInterfaces:注册为自身及实现的接口


示例

单例服务

[RegisterSingleton] public class SingletonService : IService { }

指定服务类型:

[RegisterSingleton(ServiceType = typeof(IService))] public class SingletonService : IService { }

支持IEnumerable<T>多服务解析:

[RegisterSingleton(Duplicate = DuplicateStrategy.Append)] public class SingletonService : IService { }

作用域服务

[RegisterScoped] public class ScopedService : IService { }

瞬态服务

[RegisterTransient] public class TransientService : IService { }

工厂注册

[RegisterTransient(Factory = nameof(ServiceFactory))] publicclassFactoryService : IFactoryService { privatereadonly IService _service; public FactoryService(IService service) { _service = service; } public static IFactoryService ServiceFactory(IServiceProvider serviceProvider) { returnnew FactoryService(serviceProvider.GetService<IService>()); } }

开放泛型(Open Generic)

[RegisterSingleton(ImplementationType = typeof(OpenGeneric<>), ServiceType = typeof(IOpenGeneric<>))] public class OpenGeneric<T> : IOpenGeneric<T> { }

版本 5.0+ 支持自注册开放泛型:

[RegisterSingleton] public class OpenGeneric<T> : IOpenGeneric<T> { }

泛型特性(需 .NET 7.0+)

[RegisterSingleton<IService>] public class ServiceImplementation : IService { }

Keyed 服务(需 Microsoft.Extensions.DependencyInjection 8.0+)

[RegisterSingleton<IServiceKeyed>(ServiceKey = "Alpha")] public class ServiceAlphaKeyed : IServiceKeyed { } [RegisterSingleton<IServiceKeyed>(ServiceKey = "Beta")] public class ServiceBetaKeyed : IServiceKeyed { }

使用枚举注册:

public enum ServiceType { Alpha, Beta } [RegisterSingleton<IServiceKeyed>(ServiceKey = ServiceType.Alpha)] public class ServiceAlphaTypeKeyed : IServiceKeyed { } [RegisterSingleton<IServiceKeyed>(ServiceKey = ServiceType.Beta)] public class ServiceBetaTypeKeyed : IServiceKeyed { }

使用工厂方法注册:

[RegisterSingleton<IServiceKeyed>(ServiceKey = "Charlie", Factory = nameof(ServiceFactory))] [RegisterSingleton<IServiceKeyed>(ServiceKey = "Delta", Factory = nameof(ServiceFactory))] public class ServiceFactoryKeyed : IServiceKeyed { public ServiceFactoryKeyed(object? serviceKey) { ServiceKey = serviceKey; } public object? ServiceKey { get; } public static IServiceKeyed ServiceFactory(IServiceProvider serviceProvider, object? serviceKey) { return new ServiceFactoryKeyed(serviceKey); } }

添加到容器

源生成器会生成一个扩展方法,将所有发现的服务注册到容器中:

var services = new ServiceCollection(); services.AddInjectioTestsConsole();

自定义扩展方法名称(通过 MSBuild 属性InjectioName):

<PropertyGroup> <InjectioName>Library</InjectioName> </PropertyGroup> <ItemGroup> <CompilerVisibleProperty Include="InjectioName" /> </ItemGroup>

使用方法:

var services = new ServiceCollection(); services.AddLibrary();

注册标签(Tags)

标记服务:

public interface IServiceTag { } [RegisterSingleton(Tags = "Client,FrontEnd")] public class ServiceTag : IServiceTag { }

在注册方法中使用标签:

public static class ServiceRegistration { [RegisterServices] public static void Register(IServiceCollection services, ISet<string> tags) { // 根据 tags 条件注册服务 } }

添加到容器时指定标签(不指定则注册所有服务):

var services = new ServiceCollection(); services.AddInjectioTestsLibrary("Client");

💡 总结

Injectio让 .NET 项目的依赖注入变得自动化、优雅,同时支持:

  • • 多种生命周期:Singleton / Scoped / Transient

  • • 工厂、模块、泛型、Keyed 服务

  • • 标签控制和重复策略

  • • 最小化手动注册,减少 boilerplate

如果你还在为一堆AddScoped、AddTransient头疼,Injectio 会是你的救星!

引入地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 12:13:32

实测对比后!千笔·专业学术智能体,行业天花板级的AI论文平台

你是否曾为论文选题发愁&#xff0c;面对海量文献无从下手&#xff1f;是否在深夜反复修改却总感觉表达不够专业&#xff1f;论文写作不仅是学术能力的考验&#xff0c;更是时间与精力的拉锯战。对于MBA学生而言&#xff0c;既要兼顾工作&#xff0c;又要完成高质量的学术论文&…

作者头像 李华
网站建设 2026/10/22 4:16:57

Java计算机毕设之基于SpringBoot的二手交易系统基于vue+springboot的二手交易平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/21 13:19:34

Java毕设选题推荐:基于SpringBoot的二手商品交易平台基于SpringBoot的二手交易系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/19 12:13:43

学长亲荐10个降AI率工具 千笔帮你轻松降AIGC

AI降重工具&#xff0c;让论文更自然 在当前学术写作中&#xff0c;AI生成内容的普及让许多同学面临一个共同难题——如何降低AIGC率&#xff0c;同时保持论文的逻辑性和语义通顺。尤其是对于本科生而言&#xff0c;论文不仅是对知识的总结&#xff0c;更是对个人能力的展示。…

作者头像 李华
网站建设 2026/10/21 14:01:30

怎么把C盘的文件移到D盘?c盘转移文件到d盘方法图文教程

电脑已经深入到我们生活的每一个角落&#xff0c;无论你是沉浸在游戏的世界中&#xff0c;还是忙于办公软件的操作&#xff0c;电脑都是离不开的。但是&#xff0c;电脑C盘的文件积累过多&#xff0c;如果不及时处理&#xff0c;很可能会出现空间不足的情况。那么&#xff0c;怎…

作者头像 李华
网站建设 2026/10/19 4:59:31

Java毕设项目推荐-基于SpringBoot实现的智慧就业管理系统基于springboot的大学就业信息管理系统企业信息管理、招聘信息管理【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华