.NET修仙传
修炼秘籍
.net 修炼路线图
书籍大全
C#入门后该如何进阶?如何提升自己?
读写 Excel 四种方案
书籍大全
dotnet命令大全
C# 程序集加载方法
linux 下部署.net环境
.NET WebAPI中FromRoute、FromQuery、FromBody的关键角色与用法
C# 新用法
盘点C#最有价值的10个语法糖
C#基础语法与数据类型
序列化
C# 7.0
模式匹配Pattern Matching
优秀实用的类库推荐
2024年C#优秀实用的类库推荐
依赖注入与中间件
依赖注入
查询所有已注入的服务
WebApi实现批量注入
原生依赖注入
自动依赖注入框架
优秀中间件
依赖注入
Autofac
生命周期
文档操作
PDF操作
PDF合并及生成书签目录
Excel操作
几个Excel文件合并去重分类
Excel文件之COM组件方式
操作Excel文件之NPOI
INI文件
面试宝典
WebService、WCF、WebAPI、一般处理程序
C# 线程和进程的区别
asp.net core 服务生命周期
asp.net core 的中间件都有哪些
操作系统编程
获取搜狗输入法中英文
com组件集成
执行系统命令
通过句柄嵌入exe窗体程序
windows-开机自启动
程序调用cmd命令生成WCF服务的客户端调用文件
获取电脑信息
键盘记录器
键盘改键功能
监听鼠标操作
框架揭秘
01编程初体验
中间件 Middleware
路由
配置管理
配置系统
配置管理
日志管理
Log4Net
NLog
.net core原始日志记录
日志管理
Serilog
LINQ
LINQ概讲
LINQ编程
常用方法
ORM
EF Core初始化
EF Core的实体类配置
执行原生SQL语句
EF Core
操作sqlite
操作Mysql数据库
操作LiteDB
AutoMapper高效实现对象映射
AutoMapper
AutoMapper 10个常用方法总结
缓存
Redis支持哪几种数据类型?
什么是Redis?简述它的优缺点?
Redis相比memcached有哪些优势?
认证
什么是 JWT?它是如何工作的?
.net framework jwt
.net core Jwt操作
认证管理
.Net WebApi校验Token/参数的几种方式
鉴权授权
Authorization的几种方式
基础语法
集合
1、C#中常用集合类型
yield return 简化迭代并提高代码质量
AOP
.net core AOP
操作筛选器
网络编程
TCP 连接的前世今生
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
网络编程
WebApi获取客户信息
通信
HTTP通信
公共类-HttpHelper
多线程编程
十种线程方式分析
Task-筑基期
parallel-筑基
消息队列
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
构建高性能 API 的高级技术
优秀教程网站
每日学习地址
全套教程汇总
理解ASP.NET Core
定时任务
定时器的三种使用方式
定时任务之windows任务计划程序
创建任务到Windows任务计划程序
定时任务之Quartz.Net
IHostedService启动时运行定时任务
JSON序列化反序列化工具
前辈
发布部署
应用部署
GRPC
使用GRPC多个proto文件
本文档使用 MrDoc 发布
-
+
首页
Autofac
Autofac 是一个功能丰富的 .NET 依赖注入容器,用于管理对象的生命周期、解决依赖关系以及进行属性注入。本文将详细讲解 Autofac 的使用方法,包括多种不同的注册方式,属性注入,以及如何使用多个 ContainerBuilder 来注册和合并组件。我们将提供详细的源代码示例来说明每个概念。 # 1. 安装 Autofac 首先,确保你已经安装了 Autofac NuGet 包。你可以使用 NuGet 包管理器或通过控制台运行以下命令来安装 Autofac: ```java Install-Package Autofac ``` # 2. 创建一个简单的控制台应用程序 我们将从一个简单的控制台应用程序开始,以演示 Autofac 的基本用法。我们将创建一个包含多个组件的容器,并演示多种注册方式以及属性注入的方法。 ```java using System; using Autofac; namespace AutofacExample { class Program { static void Main(string[] args) { // 步骤 1:创建 ContainerBuilder var builder = new ContainerBuilder(); // 步骤 2:注册组件 builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance(); builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope(); builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger"); // 步骤 3:构建容器 var container = builder.Build(); // 步骤 4:解析组件并进行属性注入 using (var scope = container.BeginLifetimeScope()) { var userRepository = scope.Resolve<IUserRepository>(); userRepository.AddUser("John Doe"); // 属性注入示例 var logger = scope.ResolveNamed<ILogger>("ConsoleLogger"); logger.Log("This is a log message with attribute injection."); } Console.WriteLine("Press Enter to exit..."); Console.ReadLine(); } } } ``` # 3. 创建组件和接口 现在,我们将创建三个组件以及它们所实现的接口。 - DatabaseConnection, - UserRepository - Logger ## DatabaseConnection.cs ```java public interface IDatabaseConnection { void Connect(); } public class DatabaseConnection : IDatabaseConnection { public void Connect() { Console.WriteLine("Connected to the database."); } } ``` ## UserRepository.cs ```java public interface IUserRepository { void AddUser(string username); } public class UserRepository : IUserRepository { private readonly IDatabaseConnection _databaseConnection; public UserRepository(IDatabaseConnection databaseConnection) { _databaseConnection = databaseConnection; } public void AddUser(string username) { _databaseConnection.Connect(); Console.WriteLine($"User '{username}' added to the database."); } } ``` ## Logger.cs ```java public interface ILogger { void Log(string message); } public class Logger : ILogger { public void Log(string message) { Console.WriteLine($"Logging: {message}"); } } ``` # 4. 多种注册方式 Autofac 提供了多种不同的组件注册方式,允许你控制组件的生命周期、解决复杂的依赖关系和应用更高级的用法。以下是一些常见的注册方式: ## 4.1. 单例注册 你可以注册一个组件为单例,这意味着容器将返回同一个实例,直到容器被销毁。在示例中,我们使用 SingleInstance() 方法将 DatabaseConnection 注册为单例。 ```java builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance(); ``` ## 4.2. 生命周期范围注册 你可以将组件注册为具有特定生命周期范围,例如单次请求或单个生命周期。在示例中,我们使用 InstancePerLifetimeScope() 方法将 UserRepository 注册为单个生命周期。 ```java builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope(); ``` ## 4.3. 命名注册 你可以注册组件并为其指定一个名称,以便在解析时根据名称来选择不同的实现。在示例中,我们使用 Named<TService, TImplementer>(string name) 方法为 Logger 注册一个名为 "ConsoleLogger" 的实现。 ```java builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger"); ``` ## 4.4. Lambda 表达式注册 你可以使用 Lambda 表达式注册一个组件,以根据需要创建实例。在示例中,我们使用 Lambda 表达式注册 DatabaseConnection。 ```java builder.Register(c => new DatabaseConnection()).As<IDatabaseConnection>(); ``` ## 4.5. 泛型组件注册 你可以注册泛型组件,允许你在解析时提供类型参数。在示例中,我们使用 RegisterGeneric 方法注册泛型组件 GenericRepository<T>。 ```java builder.RegisterGeneric(typeof(GenericRepository<>)).As(typeof(IGenericRepository<>)); ``` ## 5. 属性注入 Autofac 允许你进行属性注入,这意味着你可以在组件实例化后注入属性的值。在示例中,我们演示了如何使用属性注入将 ILogger 注入到 UserRepository 中。 首先,我们需要为 UserRepository 类添加一个属性,并使用 [Autowired] 特性进行标记: ```java public class UserRepository : IUserRepository { private readonly IDatabaseConnection _databaseConnection; // 使用 [Autowired] 特性进行属性注入 [Autowired] public ILogger Logger { get; set; } public UserRepository(IDatabaseConnection databaseConnection) { _databaseConnection = databaseConnection; } public void AddUser(string username) { _databaseConnection.Connect(); Console.WriteLine($"User '{username}' added to the database."); // 使用注入的 Logger Logger.Log("User added."); } } ``` 接下来,我们需要在容器构建前启用属性注入。这可以通过配置 ContainerBuilder 来实现: ```java var builder = new ContainerBuilder(); builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance (); builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope(); builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger"); // 启用属性注入 builder.RegisterCallback(PropertyInjector.InjectProperties); var container = builder.Build(); ``` 现在,当 UserRepository 被解析时,Logger 属性将自动注入,从而实现属性注入。 # 6. 使用多个ContainerBuilder合并注册 有时候,你可能需要在不同的模块或程序部分中注册组件。对于这种情况,你可以使用多个 ContainerBuilder 对象,并最终将它们合并到一个主容器中。下面是如何实现这一点的示例: ## Program.cs(扩展) 在上面的示例中,我们已经创建了一个容器并注册了组件。现在,我们将添加一个额外的 ContainerBuilder,注册另一个组件,然后将它们合并。 ```java // 步骤 7:使用另一个 ContainerBuilder 注册另一个组件 var builder2 = new ContainerBuilder(); builder2.RegisterType<EmailSender>().As<IEmailSender>(); // 步骤 8:合并 ContainerBuilder builder.Update(builder2); ``` ## EmailSender.cs ```java public interface IEmailSender { void SendEmail(string to, string subject, string message); } public class EmailSender : IEmailSender { public void SendEmail(string to, string subject, string message) { Console.WriteLine($"Sending email to {to} with subject: {subject}"); Console.WriteLine($"Message: {message}"); } } ``` 现在,我们已经注册了一个名为 EmailSender 的额外组件,并将其合并到主容器中。 # 7. 使用多个 ContainerBuilder 示例 这是完整的示例代码: Program.cs(完整) ```java using System; using Autofac; namespace AutofacExample { class Program { static void Main(string[] args) { // 步骤 1:创建 ContainerBuilder var builder = new ContainerBuilder(); // 步骤 2:注册组件 builder.RegisterType<DatabaseConnection>().As<IDatabaseConnection>().SingleInstance(); builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope(); builder.RegisterType<Logger>().As<ILogger>().Named<ILogger>("ConsoleLogger"); // 步骤 3:构建容器 var container = builder.Build(); // 步骤 4:解析组件并进行属性注入 using (var scope = container.BeginLifetimeScope()) { var userRepository = scope.Resolve<IUserRepository>(); userRepository.AddUser("John Doe"); // 属性注入示例 var logger = scope.ResolveNamed<ILogger>("ConsoleLogger"); logger.Log("This is a log message with attribute injection."); } // 步骤 7:使用另一个 ContainerBuilder 注册另一个组件 var builder2 = new ContainerBuilder(); builder2.RegisterType<EmailSender>().As<IEmailSender>(); // 步骤 8:合并 ContainerBuilder builder.Update(builder2); // 步骤 9:解析新组件 using (var scope = container.BeginLifetimeScope()) { var emailSender = scope.Resolve<IEmailSender>(); emailSender.SendEmail("user@example.com", "Hello", "This is a test email."); } Console.WriteLine("Press Enter to exit..."); Console.ReadLine(); } } } ``` 这个示例演示了如何使用多个 ContainerBuilder 注册不同的组件,并将它们合并到一个容器中。当程序运行时,它会输出以下内容: ```java Connected to the database. User 'John Doe' added to the database. Logging: This is a log message with attribute injection. Sending email to user@example.com with subject: Hello Message: This is a test email. Press Enter to exit... ``` 这表明我们成功注册和合并了不同的组件,并且它们可以一起工作。 Autofac 是一个强大的 .NET 依赖注入容器,它提供了多种注册方式、属性注入以及合并多个 ContainerBuilder 的功能,使你能够更灵活地管理对象的生命周期和解决依赖关系。希望这个示例能够帮助你更好地理解 Autofac 的使用方式,并在你的.NET 项目中更好地应用依赖注入。Autofac 的强大功能使它成为一个优秀的依赖注入容器,适用于各种应用场景。 [[1]][来源] [来源]: https://www.cnblogs.com/hanbing81868164/p/17872593.html
孙端己
2024年7月15日 17:34
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码