Autofac需显式注册、构建容器并解析,漏任一环节即抛DependencyResolutionException;未用.As()声明服务契约是“未注册类型”异常主因;泛型注册须用RegisterGeneric绑定开放泛型;SingleInstance()作用域限于当前容器;ASP.NET Core中需正确配置AutofacServiceProviderFactory才能触发ConfigureContainer。

Autofac 不是“装上就能用”的黑盒,它必须显式注册类型、构建容器、再通过 Resolve 获取实例——漏掉任一环节,DependencyResolutionException 就会立刻报错。
为什么 container.Resolve() 总抛出“未注册类型”异常
这是最常见卡点:你写了 builder.RegisterType,但调用 container.Resolve 时失败。根本原因不是 Autofac “不认识接口”,而是没告诉它“这个实现类能提供哪个服务”。
- 必须用
.As显式声明服务契约,仅() RegisterType只注册了具体类型,不暴露为可解析的服务 - 如果接口和实现不在同一程序集,确保引用已正确添加,且编译后 DLL 被加载(调试时检查
AppDomain.CurrentDomain.GetAssemblies()) - 注册顺序无关紧要,但
Build()后不能再调用RegisterType—— 容器已冻结
RegisterType 和 RegisterGeneric 的适用边界
泛型注册不是“给所有 T 都套一层”,而是为开放泛型类型(如 Repository)批量绑定封闭泛型服务(如 IRepository)。
- 用
RegisterType注册非泛型类或封闭泛型类(如() MyService) - 用
RegisterGeneric(typeof(Repository)).As(typeof(IRepository))绑定开放泛型,后续解析IRepository时自动构造Repository - 别对
Repository做RegisterType—— 编译不过,T未约束
单例生命周期陷阱:SingleInstance() 不等于“全局唯一”
SingleInstance() 的作用域是容器本身。如果你在 ASP.NET Core 中用 AutofacServiceProviderFactory,默认每个请求都新建一个子作用域(ILifetimeScope),这时 SingleInstance() 实际是“每请求单例”,而非应用级单例。
- 要跨整个应用共享实例(如配置管理器),必须注册在根容器,并确保解析也发生在根作用域(
app.ApplicationServices.GetAutofacRoot().Resolve)() - 若误在子作用域中注册
SingleInstance(),不同请求拿到的是各自独立的“单例”,状态不互通 - 数据库上下文这类资源通常应设为
InstancePerLifetimeScope(),避免跨请求共享引发并发问题
ASP.NET Core 集成时 ConfigureContainer 方法不执行
这个方法只在使用 AutofacServiceProviderFactory 且项目模板正确时才被调用。常见失效场景:
-
Program.cs中漏掉.UseServiceProviderFactory(new AutofacServiceProviderFactory()) - Startup 类未标记为
public,或构造函数参数无法被默认 DI 容器解析(Autofac 还没启动,没法帮你解) - 用了 .NET 6+ 的 Minimal Hosting 模型,但仍在
Startup里写ConfigureContainer—— 此时应改用Host.CreateDefaultBuilder+ContainerBuilder手动接管
Autofac 的核心复杂度不在语法,而在于“作用域嵌套”和“生命周期传播”——子作用域能否访问父作用域注册的单例?解析时传入的 NamedParameter 会不会覆盖容器里已注册的同名服务?这些细节不验证就上线,很容易在高并发下出现状态错乱或内存泄漏。











