Autofac之说
1.Autofac前言
帮助开发者管理组件之间的依赖关系(降低代码之间的耦合度)、提供依赖注入功能,并且提供了丰富的扩展功能
- AutoFac的三种生命周期
A.瞬时(默认的生命周期):每次获取的服务实例都不一样;
B.单例:在整个容器中获取的服务实例都是同一个;
C.作用域:相同作用域下获取到的服务实例相同,特殊的单例模式 - AutoFac三种生命周期使用场景
A.瞬时
无状态的服务类:当一个服务类没有任何状态,每次解析都需要获取一个全新的实例时,可以使用 InstancePerDependency 生命周期。
工具类:对于一些工具类,其行为和方法不依赖于对象的状态,每次解析都需要全新的实例。
B.单例
全局配置类:对于一些全局的配置信息,只需要创建一个实例并在整个应用程序中共享的情况,可以使用 SingleInstance 生命周期。
全局缓存对象:(如缓存、日志对象)对于全局缓存对象,需要保持单一实例并且在整个应用程序中共享的情况,可以使用 SingleInstance 生命周期。
C.作用域
Web 请求级别的对象:对于在一次 Web 请求中需要多次解析同一个对象的情况,可以使用 InstancePerLifetimeScope 生命周期,确保在同一个请求范围内共享对象。
业务逻辑单元级别的对象:对于某个业务逻辑单元(如订单处理、事务等),需要共享同一个对象实例的情况,可以使用 InstancePerLifetimeScope 生命周期。(某些业务逻辑内部,需要共享同一个对象实例的情况)
2.注册接口和实现之间的关系
第一步:添加工具类,继承Autofac.Module,实现Load方法,完成接口和实现之间的注册
点击查看代码
public class AutofacModuleRegister:Autofac.Module
{
/// <summary>
/// 重写Autofac管道Load方法:注册接口和实现之间的关系
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
//程序集注入业务服务
var Iservice = Assembly.Load("Interface");
var service = Assembly.Load("Service");
//根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(Iservice,service).Where(t=>t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
}
}
点击查看代码
//Autofac注入
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
//注册接口和实现层
builder.RegisterModule(new AutofacModuleRegister());
});
var app = builder.Build();
点击查看代码
//三种生命周期单独注册方式:需要根据场景选择不同的方式
builder.Services.AddSingleton<ICustomJWTService,CustomJWTService>();
//builder.Services.AddTransient<ICustomJWTService, CustomJWTService>();
//builder.Services.AddScoped<ICustomJWTService, CustomJWTService>();
点击查看代码
private IUserAppService _userService;
public ICustomJWTService _jwtService;
public LoginController(IUserAppService userService, ICustomJWTService jwtService)
{
_jwtService = jwtService;
_userService = userService;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构