1 安装
1.1 命令
PM> NuGet\Install-Package Scrutor -Version 4.2.1
2 使用
2.1 装配扫描
Scrutor
有两个针对服务集合 ServiceCollection 类的扩展方法:Scan 和 Decorate
Scan
方法用于扫描指定程序集,并按指定规则进行批量注册。
Decorate
方法用于装饰已注册服务。
2.1.1 Scan
services.Scan(scan => scan .FromAssemblyOf<Program>() // 扫描 Program 类所在的程序集 .AddClasses(
classes => classes.Where(
t => t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)
)
) // 筛选需要注册的类型 .AsImplementedInterfaces() // 暴露注册类型的接口为服务标识 .WithScopedLifetime()); // 指定生命周期模式为 Scoped
Scan
方法的参数是一个配置委托,在这个委托中一般需要定义四个东西:
- 选择程序集,选择要注册的服务类型在哪个程序集中,也就是要扫描哪个程序集,常用的有:
-
FromAssemblyOf<>、
FromAssembliesOf
扫描包含所提供的类型的程序集。 -
FromCallingAssembly
扫描调用该方法的程序集。 -
FromExecutingAssembly
扫描当前执行的程序集。 -
FromEntryAssembly
扫描入口程序集。
-
- 筛选注册类,筛选注册扫描程序集中的类型:
AddClasses()
添加所有公共的非抽象类。AddClasses(publicOnly)
添加所有非抽象类,设置publicOnly = false
可以添加internal、private
修饰的类。AddClass
添加符合筛选条件的类。(
predicate)
AddClasses(predicate, publicOnly)
前面两种方法的结合。
- 暴露服务标识,注册类型应该以何种方式作为标识暴露:
AsImplementedInterface()
暴露实现类所有的接口。AsSelf()
有时我们注册的类是没有实现接口的,所以也可以用自身作为标识暴露。AsMatchingInterface()
大多数情况下,接口和实现类都会根据IClass、Class
As<>
可以自由选择任何类型作为标识进行暴露。
- 生命周期,注册服务使用的生命周期模式:
WithTransientLifetime()
瞬时生命周期。WithScopedLifetime()
作用域生命周期。WithSingletonLifetime()
单例生命周期模式。
2.2 重复注册策略
有时候可能会出现重复注册的情况,也就是同一个服务,有多个不同的实现类。
因此注册过程有先后,所以这个时候可以利用 Scrutor 提供的重复注册处理策略:Append
、Skip
、Throw
和Replace
。
Append
叠加注册,这是默认的策略,也就是所有实现类都注册,但默认情况只有最先注册的才会生效。Skip
跳过重复的注册服务,已注册的服务,不再为其注册其它实现类。Throw
抛弃已注册的接口,已注册的服务实现类将被抛弃,而是为该服务注册新的实现类。Replace
替换策略,它有三种替换方式:替换重复的实现类、替换重复的接口、替换任意重复。
标签:Scan,程序,Scrutor,扫描,接口,注册,DependencyInjection,NET From: https://www.cnblogs.com/ShenhaoCore/p/17182139.html