首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >依赖注入的自动化修炼之道 - 告别手动注册的苦修时代

依赖注入的自动化修炼之道 - 告别手动注册的苦修时代

作者头像
云中小生
发布2025-08-24 08:53:20
发布2025-08-24 08:53:20
10500
代码可运行
举报
运行总次数:0
代码可运行

各位.NET道友们好!今天我们要聊的是一个让无数.NET修士又爱又恨的话题——依赖注入(DI)。这个在ASP.NET Core修炼体系中至关重要的心法,你是否还在用最原始的方式一个一个手动注册?今天,本座就要传授你们一套自动化修炼的秘法!

一、手动注册的苦修之痛

初入.NET仙门时,我们都这样修炼DI大法:

代码语言:javascript
代码运行次数:0
运行
复制


services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IUserService, UserService>();
services.AddScoped<IOrderService, OrderService>();

这种修炼方式在小项目中尚可,但随着修为日深,项目规模扩大,这种手动注册的方式就会让你:

  • 频繁遭遇"Unable to resolve service"的走火入魔
  • 每新增一个服务就要手动注册一次,效率低下
  • 注册代码越来越长,维护困难
  • 容易忘记注册新添加的服务

二、神器"Scrutor"现世

幸得.NET仙界大能Kristian Hellang所创“Scrutor”神器,这是一套基于Microsoft.Extensions.DependencyInjection的扩展库,专门解决DI自动化注册难题。

安装神器

代码语言:javascript
代码运行次数:0
运行
复制


Install-Package Scrutor

代码语言:javascript
代码运行次数:0
运行
复制


dotnet add package Scrutor


三、四大自动化修炼法门

法门一:批量注册接口实现

代码语言:javascript
代码运行次数:0
运行
复制


services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Repository")))
.AsImplementedInterfaces()
.WithTransientLifetime());

此法门解析:

代码语言:javascript
代码运行次数:0
运行
复制


// FromAssemblyOf<Startup>:从Startup所在程序集搜寻
// AddClasses:筛选符合条件的类
// AsImplementedInterfaces:注册为实现的接口
// WithTransientLifetime:设置生命周期

法门二:命名约定自动匹配

遵循"IClass"对应"Class"命名规范时:

代码语言:javascript
代码运行次数:0
运行
复制


services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses()
.AsMatchingInterface()
.WithTransientLifetime());

法门三:无接口类自注册

代码语言:javascript
代码运行次数:0
运行
复制


services.Scan(scan=> scan
.FromAssemblyOf<MyService>()
.AddClasses()
.AsSelf()
.WithSingletonLifetime());

法门四:多重实现处理策略

当一接口有多个实现时:

1.Append(默认):全部注册

2.Skip:跳过重复

代码语言:javascript
代码运行次数:0
运行
复制

.UsingRegistrationStrategy(RegistrationStrategy.Skip)

3.Replace:替换旧注册


四、实战心法

  • 项目结构规划:按功能模块组织,如:
代码语言:javascript
代码运行次数:0
运行
复制


Services/
  User/
    IUserService.cs
    UserService.cs
  Order/
    IOrderService.cs
    OrderService.cs

  • 生命周期管理:
代码语言:javascript
代码运行次数:0
运行
复制


services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))
.AsImplementedInterfaces()
.WithScopedLifetime()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Repository")))
.AsImplementedInterfaces()
.WithTransientLifetime());

  • 异常处理 :添加日志记录注册过程

五、修炼心得

  • 命名规范是自动化注册的基础
  • 复杂的注册逻辑仍需手动处理
  • 适当结合特性(Attribute)可以实现更灵活的注册
  • 定期检查自动注册结果,确保符合预期

六、进阶修炼

Scrutor还提供了装饰器模式支持:

代码语言:javascript
代码运行次数:0
运行
复制


services.Decorate<IUserService, UserServiceDecorator>();


结语

依赖注入的自动化修炼之道,让我们的.NET修行之路更加顺畅。从此告别手动注册的苦修时代,将更多精力投入到真正的业务逻辑开发中。



诸位道友若对此心法感兴趣,不妨点个赞,点个关注 分享给更多.NET修行者。若有疑问,欢迎在评论区交流讨论!

修炼之路漫漫,愿与诸君共勉! 🚀

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 .NET修仙日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、手动注册的苦修之痛
  • 二、神器"Scrutor"现世
    • 安装神器
  • 三、四大自动化修炼法门
    • 法门一:批量注册接口实现
    • 法门二:命名约定自动匹配
    • 法门三:无接口类自注册
    • 法门四:多重实现处理策略
  • 四、实战心法
  • 五、修炼心得
  • 六、进阶修炼
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档