各位.NET道友们好!今天我们要聊的是一个让无数.NET修士又爱又恨的话题——依赖注入(DI)。这个在ASP.NET Core修炼体系中至关重要的心法,你是否还在用最原始的方式一个一个手动注册?今天,本座就要传授你们一套自动化修炼的秘法!
初入.NET仙门时,我们都这样修炼DI大法:
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient<IUserService, UserService>();
services.AddScoped<IOrderService, OrderService>();
这种修炼方式在小项目中尚可,但随着修为日深,项目规模扩大,这种手动注册的方式就会让你:
幸得.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());
Scrutor还提供了装饰器模式支持:
services.Decorate<IUserService, UserServiceDecorator>();
依赖注入的自动化修炼之道,让我们的.NET修行之路更加顺畅。从此告别手动注册的苦修时代,将更多精力投入到真正的业务逻辑开发中。
诸位道友若对此心法感兴趣,不妨点个赞,点个关注 分享给更多.NET修行者。若有疑问,欢迎在评论区交流讨论!
修炼之路漫漫,愿与诸君共勉! 🚀