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