一、简介
Scrutor 是一个用于 .NET 的开源库,它扩展了依赖注入容器(如 Microsoft.Extensions.DependencyInjection),提供了更强大的扫描和注册服务的功能。通过 Scrutor,你可以更加灵活和简洁地批量注册服务,尤其是在处理大量接口和实现类时非常有用。
二、作用
- 自动注册:通过程序集扫描自动注册服务,无需手动逐个添加。
- 条件注册:根据特定条件(如命名约定、特性标记等)注册服务。
- 生命周期管理:支持不同的生命周期(瞬态、作用域、单例)。
- 装饰器模式:支持装饰器模式,可以在不修改原有代码的情况下增强服务功能。
三、应用场景
- 微服务架构:在微服务中,通常会有大量的服务接口和实现类,通过 Scrutor 可以简化这些服务的注册过程。
- 插件系统:在插件系统中,可以动态扫描和注册插件。
- 模块化应用:在模块化应用中,可以按模块批量注册服务。
四、安装 Scrutor
首先,你需要安装 Scrutor 包:
dotnet add package Scrutor
五、代码实现演示
1、自动注册服务
假设你有以下服务接口和实现类:
public interface IMyService
{void DoWork();
}public class MyService : IMyService
{public void DoWork(){Console.WriteLine("Doing work...");}
}
你可以使用 Scrutor 来自动注册这些服务:
using Microsoft.Extensions.DependencyInjection;
using Scrutor;var services = new ServiceCollection();services.Scan(scan => scan.FromAssemblyOf<IMyService>() // 扫描包含 IMyService 的程序集.AddClasses(classes => classes.AssignableTo<IMyService>()) // 查找所有实现 IMyService 的类.AsImplementedInterfaces() // 将它们注册为对应的接口.WithTransientLifetime()); // 使用瞬态生命周期var serviceProvider = services.BuildServiceProvider();var myService = serviceProvider.GetService<IMyService>();
myService.DoWork();
2、条件注册
你还可以根据特定条件注册服务,例如按命名约定:
services.Scan(scan => scan.FromAssemblyOf<IMyService>().AddClasses(classes => classes.Where(type => type.Name.EndsWith("Service"))).AsImplementedInterfaces().WithScopedLifetime()); // 使用作用域生命周期
3、装饰器模式
Scrutor 还支持装饰器模式。假设你有一个装饰器类:
public class LoggingMyServiceDecorator : IMyService
{private readonly IMyService _inner;public LoggingMyServiceDecorator(IMyService inner){_inner = inner;}public void DoWork(){Console.WriteLine("Logging before work");_inner.DoWork();Console.WriteLine("Logging after work");}
}
你可以使用 Scrutor 注册装饰器:
services.Scan(scan => scan.FromAssemblyOf<IMyService>().AddClasses(classes => classes.AssignableTo<IMyService>()).AsImplementedInterfaces().WithTransientLifetime());services.Decorate<IMyService, LoggingMyServiceDecorator>();var serviceProvider = services.BuildServiceProvider();var myService = serviceProvider.GetService<IMyService>();
myService.DoWork();
六、总结
Scrutor 是一个非常强大的工具,可以大大简化依赖注入的配置工作,特别是在大型项目中。它提供了灵活的扫描和注册机制,使得服务注册更加简洁和可维护。如果你在项目中遇到大量的服务注册需求,Scrutor 会是一个很好的选择。