依赖注入策略
本页描述当前框架的依赖注入机制。团队规范、服务注册分层和 Autofac 构造函数约束,请优先阅读 宿主与启动。
AgileLabs Framework 采用 Autofac 作为默认 IoC 容器,兼顾 AOP 能力与未注册类型的解析(用于兼容遗留代码)。
注册途径
- AppBuildOptions.ConfigureServices:在应用选项中直接注入服务,适用于 Host 级别依赖或跨模块初始化。
- IServiceRegister / IAdvancedServiceRegister:在任意程序集实现接口即可自动被扫描,常用于模块化拆分。
- 自注册接口:标记
ISingleton、IScoped、ITransient后,框架会自动根据生命周期注册。
以上三种方式可混用。建议在通用组件中使用
IServiceRegister,在业务应用内通过ConfigureServices补充。
自动发现流程
DependencyRegisterExtensions.AutoDiscoverDependencyService 会:
- 使用
ITypeFinder遍历程序集导出的类型。 - 找到实现
IScoped/ITransient/ISingleton的类。 - 根据类名与接口名(去掉
I前缀,或以Service/Repository/Provider/Helper/Factory结尾)推断匹配的接口。 - 调用
TryAddScoped/TryAddTransient/TryAddSingleton完成注册。
这样既能自动注册 FooService : IFooService, IScoped,也可以保留接口+实现的绑定。
IAdvancedServiceRegister
提供更精细控制,例如根据 AppBuildContext 动态读取配置或注入 HostBuilderContext。
public class OpenIddictServiceRegister : IAdvancedServiceRegister
{
public void ConfigureServices(IServiceCollection services, AppBuildContext context)
{
services.AddHttpClient();
}
}
使用技巧
- 区分生命周期:框架遵循 ASP.NET Core 生命周期语义,避免把 DbContext 之类的依赖注册为 Singleton。
- 未注册解析:Autofac 支持按需构造未注册类型,但会绕过自动释放与拦截器,除非必要不建议使用。
- 构造函数约束:为了避免未注册对象解析与容器自动构造出现歧义,参与 DI 自动构造的类型应只保留一个
public构造函数。 - 覆盖默认实现:在
ConfigureServices中重新注册相同接口即可覆盖。
延伸阅读: