agilelabs-fx-docs main fundamentals/dependency-managements/intro.md

依赖注入策略

本页描述当前框架的依赖注入机制。团队规范、服务注册分层和 Autofac 构造函数约束,请优先阅读 宿主与启动

AgileLabs Framework 采用 Autofac 作为默认 IoC 容器,兼顾 AOP 能力与未注册类型的解析(用于兼容遗留代码)。

注册途径

  1. AppBuildOptions.ConfigureServices:在应用选项中直接注入服务,适用于 Host 级别依赖或跨模块初始化。
  2. IServiceRegister / IAdvancedServiceRegister:在任意程序集实现接口即可自动被扫描,常用于模块化拆分。
  3. 自注册接口:标记 ISingletonIScopedITransient 后,框架会自动根据生命周期注册。

以上三种方式可混用。建议在通用组件中使用 IServiceRegister,在业务应用内通过 ConfigureServices 补充。

自动发现流程

DependencyRegisterExtensions.AutoDiscoverDependencyService 会:

  1. 使用 ITypeFinder 遍历程序集导出的类型。
  2. 找到实现 IScoped/ITransient/ISingleton 的类。
  3. 根据类名与接口名(去掉 I 前缀,或以 Service/Repository/Provider/Helper/Factory 结尾)推断匹配的接口。
  4. 调用 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 中重新注册相同接口即可覆盖。

延伸阅读: