首页
学习
活动
专区
圈层
工具
发布

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

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

一、手动注册的苦修之痛

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

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自动化注册难题。

安装神器

Install-Package Scrutor

dotnet add package Scrutor

三、四大自动化修炼法门

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

services.Scan(scan => scan

.FromAssemblyOf<Startup>()

.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Repository")))

.AsImplementedInterfaces()

.WithTransientLifetime());

此法门解析:

// FromAssemblyOf<Startup>:从Startup所在程序集搜寻

// AddClasses:筛选符合条件的类

// AsImplementedInterfaces:注册为实现的接口

// WithTransientLifetime:设置生命周期

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

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

services.Scan(scan => scan

.FromAssemblyOf<Startup>()

.AddClasses()

.AsMatchingInterface()

.WithTransientLifetime());

法门三:无接口类自注册

services.Scan(scan=> scan

.FromAssemblyOf<MyService>()

.AddClasses()

.AsSelf()

.WithSingletonLifetime());

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

当一接口有多个实现时:

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

2.Skip:跳过重复

.UsingRegistrationStrategy(RegistrationStrategy.Skip)

3.Replace:替换旧注册

四、实战心法

项目结构规划

:按功能模块组织,如:

Services/

User/

  IUserService.cs

  UserService.cs

Order/

  IOrderService.cs

  OrderService.cs

生命周期管理:

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还提供了装饰器模式支持:

services.Decorate<IUserService, UserServiceDecorator>();

结语

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

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

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

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OPnl-Y4MrlCmri2WloD2h8IQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券