services.Scan(scan => scan
// 扫描特定类型所在的程序集,这里是 ITransientService 所在的程序集
.FromAssemblyOf<ITransientService>()
// .AddClasses 在上面获取到的程序集中扫描所有公开、非抽象类型
// 之后可以通过委托进行类型筛选,例如下面只扫描实现 ITransientService 的类型
.AddClasses(classes => classes.AssignableTo<ITransientService>())
// 将上面的类型作为它实现的所有接口进行注册
// 如果类型实现了 N 个接口,那么就会有三个独立的注册
.AsImplementedInterfaces()
// 最后指定注册的生存期,如瞬时,作用域,还是单例
.WithTransientLifetime()
// 重复上面操作,比如这里扫描 IScopedService 所在的程序集
.AddClasses(classes => classes.AssignableTo<IScopedService>())
// 这里和上面不一样的是,这里指定只实现特定的几口,也就是只注册一次
.As<IScopedService>()
// 指定注册的生存期
.WithScopedLifetime()
// 也支持泛型注册,单个泛型参数
.AddClasses(classes => classes.AssignableTo(typeof(IOpenGeneric<>)))
.AsImplementedInterfaces()
// 多个泛型参数
.AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<,>)))
.AsImplementedInterfaces());
github: https://github.com/khellang/Scrutor