各位.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修行者。若有疑问,欢迎在评论区交流讨论!
修炼之路漫漫,愿与诸君共勉!