# Autofac 完整详解 + 全部注册方式实战案例
Autofac 完整详解 全部注册方式实战案例一、Autofac 核心概述1. 什么是 AutofacAutofac 是 .NET 生态最灵活、功能最全的依赖注入DI容器支持 .NET Framework / .NET Core / .NET 5~8完美适配控制台、WPF、ASP.NET Core、WinForms。核心优势灵活的生命周期管理瞬时、单例、作用域、线程作用域等批量注册、程序集扫描、泛型自动注入属性注入、构造注入、方法注入多模式模块拆分注册、条件注册、命名/键服务、延迟加载 Lazy与 ASP.NET Core、WPF MVVM、SqlSugar、NLog 无缝集成2. 基础术语接口(Service)对外暴露抽象IUserService实现(Implementation)具体类UserService容器容器(ContainerBuilder)注册所有类型的构建器IContainer构建完成的根容器全局唯一ILifetimeScope作用域容器子容器释放时自动销毁实例生命周期控制对象创建与销毁时机3. NuGet 安装!-- 核心包 -- Install-Package Autofac !-- ASP.NET Core 适配web项目专用 -- Install-Package Autofac.Extensions.DependencyInjection二、完整项目基础示例统一测试实体先定义统一测试接口与实现所有注册案例复用// 业务接口 public interface IUserService { void Show(); } // 普通实现类 public class UserService : IUserService { public void Show() { Console.WriteLine(UserService 执行); } } // 带构造参数依赖 public interface IOrderRepo { } public class OrderRepo : IOrderRepo { } public class OrderService { private readonly IOrderRepo _repo; public string Name { get; set; } // 用于属性注入测试 // 构造依赖 public OrderService(IOrderRepo repo) { _repo repo; } public void Print() { Console.WriteLine($OrderService, 属性值:{Name}); } } // 泛型测试 public interface IRepositoryT { } public class RepositoryT : IRepositoryT { } // 模块拆分专用模块类 public class BusinessModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterTypeUserService().AsIUserService(); } }三、Autofac 全部注册方式 可运行案例前置统一初始化代码所有案例共用// 1. 创建构建器 var builder new ContainerBuilder(); // 此处填写下面任意注册代码 // 2. 构建根容器 IContainer container builder.Build(); // 3. 创建作用域推荐避免直接用根容器Resolve using var scope container.BeginLifetimeScope(); // 4. 解析服务使用 var user scope.ResolveIUserService(); user.Show();分类1基础单类型注册最常用1.1 仅注册自身不绑定接口// 只能 ResolveUserService()不能用 IUserService builder.RegisterTypeUserService(); // 解析 var svc scope.ResolveUserService();1.2 注册实现并暴露接口标准写法builder.RegisterTypeUserService().AsIUserService(); // 解析scope.ResolveIUserService()1.3 一个实现绑定多个接口public interface IBase { } public class UserService : IUserService, IBase { } builder.RegisterTypeUserService() .AsIUserService() .AsIBase();1.4 AsSelf() 同时暴露自身接口builder.RegisterTypeUserService() .AsIUserService() .AsSelf(); // 两种方式都能解析 scope.ResolveIUserService(); scope.ResolveUserService();分类2实例注册手动new对象容器不负责创建2.1 RegisterInstance 注册现成对象适合静态配置、第三方SDK实例、单例固定对象var userSvc new UserService(); builder.RegisterInstance(userSvc).AsIUserService(); // 生命周期强制为单例容器不会新建2.2 RegisterInstance 外部传入配置var config new AppConfig { ConnectionString test }; builder.RegisterInstance(config).SingleInstance();分类3Lambda工厂注册 Register.Register3.1 简单Lambda创建实例手动控制构造逻辑灵活传参builder.Register(ctx { // ctx 是当前作用域可以解析依赖 var repo ctx.ResolveIOrderRepo(); return new OrderService(repo); }).AsSelf();3.2 带参数构造、动态赋值builder.Register(ctx { var repo ctx.ResolveIOrderRepo(); var orderSvc new OrderService(repo); orderSvc.Name 工厂赋值; return orderSvc; }).AsSelf();3.3 无依赖简单工厂builder.Register(_ new UserService()).AsIUserService();分类4泛型批量注册仓储层必备4.1 开放泛型注册 RegisterGeneric// 自动适配 IRepositoryUser IRepositoryOrder builder.RegisterGeneric(typeof(Repository)) .As(typeof(IRepository)); // 使用 var userRepo scope.ResolveIRepositoryUser(); var orderRepo scope.ResolveIRepositoryOrder();分类5程序集批量扫描注册大型项目核心5.1 扫描当前程序集接口以I开头、实现同命名var assembly Assembly.GetExecutingAssembly(); builder.RegisterAssemblyTypes(assembly) // 筛选只导出 public 类 .PublicOnly() // 匹配规则实现 IXXX 的 XXX 类 .Where(t t.Name.StartsWith(User) || t.Name.EndsWith(Service)) // 自动绑定对应接口 .AsImplementedInterfaces() // 默认瞬时生命周期 .InstancePerDependency();5.2 多程序集扫描分层架构Service、Repositoryvar asm1 Assembly.Load(Project.Service); var asm2 Assembly.Load(Project.Repository); builder.RegisterAssemblyTypes(asm1, asm2) .Where(t t.Name.EndsWith(Service)) .AsImplementedInterfaces();5.3 排除特定类型、只注册自身builder.RegisterAssemblyTypes(assembly) .ExceptUserService() // 排除UserService .AsSelf();分类6模块拆分注册 Module大型项目解耦6.1 定义Module前文 BusinessModulepublic class BusinessModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterTypeUserService().AsIUserService(); builder.RegisterTypeOrderRepo().AsIOrderRepo(); } }6.2 加载模块// 方式1直接new模块 builder.RegisterModule(new BusinessModule()); // 方式2按程序集扫描所有Module自动加载 builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());分类7属性注入、方法注入、构造参数覆盖7.1 属性注入 PropertiesAutowired()自动给类中公共属性注入依赖builder.RegisterTypeOrderService() .AsSelf() .PropertiesAutowired(); // 自动填充所有可解析属性 // 如果只想注入指定属性 builder.RegisterTypeOrderService() .AsSelf() .WithProperty(Name, 手动赋值);7.2 构造参数显式赋值 WithParameter覆盖构造函数参数固定值/从容器解析// 固定值参数 builder.RegisterTypeOrderService() .WithParameter(repo, new OrderRepo()) .AsSelf(); // 从容器解析参数 builder.RegisterTypeOrderService() .WithParameter( (pi, ctx) pi.Name repo, (pi, ctx) ctx.ResolveIOrderRepo() );7.3 方法注入 OnActivated / OnActivating实例创建前后回调做初始化builder.RegisterTypeOrderService() .AsSelf() .OnActivating(ctx { // 创建前执行 var svc ctx.Instance as OrderService; svc.Name 激活前赋值; }) .OnActivated(ctx { // 创建完成后执行初始化方法 var svc ctx.Instance as OrderService; svc.Print(); });分类8命名服务、键服务同一接口多实现8.1 命名服务 Named// 两个实现 builder.RegisterTypeUserService().NamedIUserService(admin); builder.RegisterTypeCustomerUserService().NamedIUserService(customer); // 解析指定名称 var adminSvc scope.ResolveNamedIUserService(admin);8.2 键服务 Keyed用枚举/常量做Keypublic enum UserType { Admin, Customer } builder.RegisterTypeUserService().KeyedIUserService(UserType.Admin); builder.RegisterTypeCustomerUserService().KeyedIUserService(UserType.Customer); var cusSvc scope.ResolveKeyedIUserService(UserType.Customer);8.3 全部解析 ResolveAll同一接口多个实现全部取出var allServices scope.ResolveIEnumerableIUserService(); foreach (var s in allServices) s.Show();分类9延迟加载 Lazy、Func 工厂注入9.1 Lazy 延迟实例化使用时才创建无需额外注册直接构造注入LazyIUserServicepublic class TestApp { private readonly LazyIUserService _lazyUser; public TestApp(LazyIUserService lazyUser) { _lazyUser lazyUser; } public void Run() { // 第一次访问Value才创建对象 _lazyUser.Value.Show(); } } builder.RegisterTypeTestApp();9.2 Func 动态多次创建实例public class TestApp { private readonly FuncIUserService _userFactory; public TestApp(FuncIUserService userFactory) { _userFactory userFactory; } public void MultiCreate() { var u1 _userFactory(); var u2 _userFactory(); } }四、五大生命周期详解所有生命周期注册写法生命周期控制实例复用规则开发最容易踩坑生命周期说明适用场景InstancePerDependency默认瞬时每次Resolve新建无状态服务、轻量工具SingleInstance全局单例整个容器唯一配置、日志、连接池InstancePerLifetimeScope作用域单例每个子Scope一个实例数据库上下文、请求级服务InstancePerMatchingLifetimeScope指定Tag作用域单例WPF多窗口、多租户InstancePerRequestASP.NET Core请求单例Web项目专用4.1 瞬时默认可省略builder.RegisterTypeUserService() .AsIUserService() .InstancePerDependency();4.2 全局单例 SingleInstancebuilder.RegisterTypeUserService() .AsIUserService() .SingleInstance();4.3 作用域单例 InstancePerLifetimeScopebuilder.RegisterTypeOrderRepo() .AsIOrderRepo() .InstancePerLifetimeScope();4.4 标记作用域单例多窗口WPF常用// 注册带Tag匹配 builder.RegisterTypeUserService() .AsIUserService() .InstancePerMatchingLifetimeScope(MainWindow); // 创建带Tag的作用域 using var windowScope container.BeginLifetimeScope(MainWindow);4.5 ASP.NET Core 请求级单例builder.RegisterTypeDbContext() .InstancePerRequest();五、容器解析 Resolve 全部用法using var scope container.BeginLifetimeScope(); // 1. 基础解析 var user scope.ResolveIUserService(); // 2. 安全解析不存在不抛异常返回null if (scope.TryResolveIUserService(out var safeUser)) { safeUser.Show(); } // 3. 命名/键解析 var admin scope.ResolveNamedIUserService(admin); var cus scope.ResolveKeyedIUserService(UserType.Customer); // 4. 批量解析全部实现 var list scope.ResolveIEnumerableIUserService(); // 5. 带参数解析构造动态传参 var order scope.ResolveOrderService(new NamedParameter(repo, new OrderRepo()));六、ASP.NET Core 集成 Autofac 完整案例Program.csvar builder WebApplication.CreateBuilder(args); // 替换默认DI为Autofac builder.Host.ConfigureContainerContainerBuilder(autofacBuilder { // 1. 批量扫描Service层 var asm Assembly.Load(Project.Service); autofacBuilder.RegisterAssemblyTypes(asm) .AsImplementedInterfaces() .InstancePerLifetimeScope(); // 2. 加载模块 autofacBuilder.RegisterModule(new BusinessModule()); }); var app builder.Build();七、WPF 集成 Autofac 通用模板var containerBuilder new ContainerBuilder(); // 注册ViewModel、Service containerBuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .Where(t t.Name.EndsWith(ViewModel)) .AsSelf() .InstancePerLifetimeScope(); IContainer container containerBuilder.Build(); // 全局作用域 App.Container container; // 打开窗口时创建子Scope using var scope container.BeginLifetimeScope(); var mainVm scope.ResolveMainViewModel(); var window new MainWindow { DataContext mainVm }; window.Show();常见踩坑总结不要直接使用根容器container.Resolve()必须BeginLifetimeScope释放资源单例不能依赖作用域实例会造成生命周期泄漏批量扫描时注意过滤抽象类、接口本身属性注入不会覆盖构造函数赋值构造优先InstancePerRequest 仅Web项目生效控制台/WPF无效注册顺序不影响解析Autofac自动匹配依赖

相关新闻

Onekey:3分钟解锁Steam游戏DLC的终极指南

Onekey:3分钟解锁Steam游戏DLC的终极指南

Onekey:3分钟解锁Steam游戏DLC的终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾经因为Steam游戏DLC价格过高而犹豫不决?或者因为区域限制无法购买心仪的…

2026/10/17 0:26:46 阅读更多 →
2025终极指南:三步免费重置JetBrains IDE试用期,告别30天限制烦恼

2025终极指南:三步免费重置JetBrains IDE试用期,告别30天限制烦恼

2025终极指南:三步免费重置JetBrains IDE试用期,告别30天限制烦恼 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾在深夜编码时,IntelliJ IDEA突然弹出试用期到期警告&…

2026/10/5 8:12:58 阅读更多 →
GHelper:华硕笔记本性能管理的轻量化解决方案,释放硬件潜能

GHelper:华硕笔记本性能管理的轻量化解决方案,释放硬件潜能

GHelper:华硕笔记本性能管理的轻量化解决方案,释放硬件潜能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivob…

2026/10/15 17:31:03 阅读更多 →

最新新闻

Pandas取单个值的性能陷阱与at/iat/get_loc高效选型指南

Pandas取单个值的性能陷阱与at/iat/get_loc高效选型指南

1. 项目概述:为什么在Pandas里“取一个值”还要专门研究?在某次处理千万级用户行为日志时,我遇到一个看似荒谬的问题:一段只取单个单元格值的代码,耗时竟占整个数据清洗流程的42%。当时用的是df.iloc[1000, 5]&#xf…

2026/10/17 0:25:55 阅读更多 →
英鹏飞TST42-48R电机驱动板UART通讯协议与寄存器实战解析

英鹏飞TST42-48R电机驱动板UART通讯协议与寄存器实战解析

简介:本资源是面向工业自动化开发者与嵌入式工程师的英鹏飞TST42-48R集成式闭环电机实操套件,聚焦ModbusRTU协议下的C#上位机控制开发,解决该型号电机资料稀缺、调试门槛高、缺乏可运行示例等实际痛点。压缩包共72个文件,含7个核心…

2026/10/17 0:25:55 阅读更多 →
SpringBoot 3.x中SpringDoc-OpenAPI最佳实践与安全加固

SpringBoot 3.x中SpringDoc-OpenAPI最佳实践与安全加固

1. 为什么Swagger在SpringBoot项目里总被“半放弃”?你肯定见过这样的场景:团队刚启动一个新SpringBoot后端项目,开发组长拍板“必须集成Swagger”,大家齐声应和。三天后,Swagger UI页面跑起来了,接口列表也…

2026/10/17 0:25:55 阅读更多 →
stc32g12单片机Modbus-RTU主机例程实战:RS485通信与CRC校验避坑指南

stc32g12单片机Modbus-RTU主机例程实战:RS485通信与CRC校验避坑指南

简介:基于STC32G12单片机的Modbus-RTU主机例程资源包,面向嵌入式开发者和工业自动化爱好者,解决在8051内核单片机上实现Modbus主机通信的问题。压缩包共140个文件,类型以72个C源文件与62个头文件为主,另有工程配置、HE…

2026/10/17 0:24:54 阅读更多 →
Proteus仿真STM32 PWM:从零搭建可测可控的数字孪生调试环境

Proteus仿真STM32 PWM:从零搭建可测可控的数字孪生调试环境

简介:本资源是面向嵌入式初学者与STM32课程实训学生的ProteusKeil联合仿真教学包,聚焦PWM原理理解与工程实现,解决学生在定时器配置、PWM输出调试及软硬件协同验证中的常见痛点。压缩包共132个文件,含34个头文件(h&…

2026/10/17 0:24:54 阅读更多 →
D-PDU API详解:汽车诊断的标准化接口规范

D-PDU API详解:汽车诊断的标准化接口规范

简介:本资源为ISO 22900-2:2017标准第二部分(D-PDU API)的完整中英文对照文档,面向汽车电子诊断系统开发工程师、车载通信协议研究人员及OBD/UDS工具开发者。该标准定义了模块化车辆通信接口(MVCI)中诊断协…

2026/10/17 0:24:54 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →