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;
        }
posted @   浮生若梦cmr  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示