1. 安装 Autofac 包
通过 NuGet 安装 Autofac
和 Autofac.Extensions.DependencyInjection
包:
Install-Package Autofac
Install-Package Autofac.Extensions.DependencyInjection
2. 基础依赖注入示例
(1) 定义接口和实现类
// 定义服务接口
public interface ILogger
{
void Log(string message);
}
// 实现类
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"日志: {message}");
}
}
// 业务类依赖 ILogger
public class OrderService
{
private readonly ILogger _logger;
// 构造函数注入
public OrderService(ILogger logger)
{
_logger = logger;
}
public void PlaceOrder(string orderId)
{
_logger.Log($"订单 {orderId} 已创建");
}
}
(2) 配置 Autofac 容器
using Autofac;
class Program
{
static void Main()
{
// 创建容器构建器
var builder = new ContainerBuilder();
// 注册 ILogger 的实现为 ConsoleLogger
builder.RegisterType
().As ();
// 注册 OrderService(自动解析构造函数依赖)
builder.RegisterType
();
// 构建容器
var container = builder.Build();
// 解析 OrderService 实例(自动注入 ILogger)
using (var scope = container.BeginLifetimeScope())
{
var orderService = scope.Resolve
(); orderService.PlaceOrder("12345");
}
}
}
输出结果:
日志: 订单 12345 已创建
3. 生命周期管理
Autofac 支持多种生命周期范围,常用选项如下:
(1) 生命周期配置示例
var builder = new ContainerBuilder();
// 单例模式(整个容器共享一个实例)
builder.RegisterType<SingletonService>().As<IService>().SingleInstance();
// 每次解析创建新实例(默认行为)
builder.RegisterType<TransientService>().As<IService>().InstancePerDependency();
// 每个生命周期作用域内单例(同一作用域内共享)
builder.RegisterType<ScopedService>().As<IService>().InstancePerLifetimeScope();
(2) 生命周期作用域实践
using (var scope = container.BeginLifetimeScope())
{
var service1 = scope.Resolve<IService>();
var service2 = scope.Resolve<IService>();
// service1 和 service2 是否为同一实例取决于注册方式
}
4. 属性注入
默认使用构造函数注入,如需属性注入需显式配置:
public class UserService
{
// 属性注入
public ILogger Logger { get; set; }
}
// 注册时启用属性注入
builder.RegisterType<UserService>()
.AsSelf()
.PropertiesAutowired(); // 自动注入属性
5. 模块化配置
将注册逻辑封装到模块中,便于管理复杂项目:
(1) 定义 Autofac 模块
public class CoreModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// 注册模块内的服务
builder.RegisterType<DatabaseLogger>().As<ILogger>();
builder.RegisterType<PaymentService>().As<IPaymentService>();
}
}
(2) 加载模块
var builder = new ContainerBuilder();
builder.RegisterModule<CoreModule>();
6. 集成 ASP.NET Core
在 ASP.NET Core 中集成 Autofac:
(1) 修改 Program.cs
var builder = WebApplication.CreateBuilder(args);
// 使用 Autofac 作为服务容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
// 配置 Autofac 容器
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule<CoreModule>();
});
var app = builder.Build();
7. 高级场景:条件注册
根据条件动态选择实现:
// 注册多个 ILogger 实现
builder.RegisterType<ConsoleLogger>().Named<ILogger>("console");
builder.RegisterType<FileLogger>().Named<ILogger>("file");
// 根据配置选择具体实现
var loggerType = ConfigurationManager.AppSettings["LoggerType"];
builder.Register(ctx => ctx.ResolveNamed<ILogger>(loggerType))
.As<ILogger>();
8. 关键注释说明
RegisterType
:注册具体类型。() As
:将类型映射到接口或基类。() SingleInstance()
:单例模式,全局唯一实例。InstancePerLifetimeScope()
:同一作用域内共享实例。PropertiesAutowired()
:启用属性自动注入。Resolve
:从容器中解析服务实例。()
总结
Autofac 提供了灵活的依赖注入解决方案,通过上述示例可快速实现:
基础注册与解析
生命周期控制
模块化组织
与 ASP.NET Core 集成
建议在大型项目中通过 模块(Module) 管理注册逻辑,确保代码可维护性。
- -
看完本文有收获?请转发分享给更多人
推荐关注「CSharp精选营」,提升编程技能
建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【CSharp技术交流群】,热烈欢迎各位进群交流学习编程心得,也希望进群的大佬能不吝分享自己遇到的技术问题和经验。
添加微信好友备注“入群”