.Net6 使用Autofac进行依赖注入

一、背景

刚接触.net 6,记录一下在.net6上是怎么使用Autofac进行动态的依赖注入的

二、注入方式

1、新建一个webapi项目,框架选择net 6

2、引用Nuget包---Autofac.Extensions.Dependency

3、在Program.cs上添加如下代码

cs 复制代码
//依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())//注册服务工厂
.ConfigureContainer<ContainerBuilder>(container =>
{  //添加依赖注入,AddModule是一个自定义的拓展方法,将依赖注入的方法单独提取出来,方便管理
    builder.Services.AddModule(container);
});
cs 复制代码
public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration)
        {
	
            //初始化配置文件
            Type baseType = typeof(IDependency);//自定义的空类
            //动态运行项目的类库
            var compilationLibrary = DependencyContext.Default
                .RuntimeLibraries
                .Where(x => !x.Serviceable
                && x.Type == "project")
                .ToList();
            var count1 = compilationLibrary.Count;
            List<Assembly> assemblyList = new List<Assembly>();

            foreach (var _compilation in compilationLibrary)
            {
                try
                {
                    assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(_compilation.Name + ex.Message);
                }
            }
            //注册程序集的方式添加依赖
            builder.RegisterAssemblyTypes(assemblyList.ToArray())
             .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)//过滤非抽象类,继承了IDependency接口的类
             .AsSelf().AsImplementedInterfaces()
             .InstancePerLifetimeScope();//实例的生命周期
            
            //单独注册依赖服务
			//注册数据库基础操作和工作单元
			builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
			builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));
			 //注册app层
			 builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
			
			 builder.RegisterType(typeof(RedisCacheContext)).As(typeof(ICacheContext));
			 
			 
			 
             builder.RegisterType<MemoryCacheService>().As<ICacheService>().SingleInstance();
            
            return services;
        }

cs 复制代码
//依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())

以及再startup.cs中添加ConfigureContainer方法

public void ConfigureContainer(ContainerBuilder builder)

{

ExtAutofac.InitAutofac(builder);

}

在app层

cs 复制代码
namespace App
{
    public static  class ExtAutofac
    {
        private static IContainer _container;
   
        public static void InitAutofac(ContainerBuilder builder)
        {
            
            //注册数据库基础操作和工作单元
            builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
            builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));

            
            //注册app层
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
            
            builder.RegisterType(typeof(RedisCacheContext)).As(typeof(ICacheContext));
            builder.RegisterType(typeof(HttpContextAccessor)).As(typeof(IHttpContextAccessor));
            
            InitDependency(builder);

        }


        /// <summary>
        /// 注入所有继承了IDependency接口
        /// </summary>
        /// <param name="builder"></param>
        private static void InitDependency(ContainerBuilder builder)
        {
            Type baseType = typeof(IDependency);
            var compilationLibrary = DependencyContext.Default
                .CompileLibraries
                .Where(x => !x.Serviceable
                            && x.Type == "project")
                .ToList();
            var count1 = compilationLibrary.Count;
            List<Assembly> assemblyList = new List<Assembly>();

            foreach (var _compilation in compilationLibrary)
            {
                try
                {
                    assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(_compilation.Name + ex.Message);
                }
            }
            
            builder.RegisterAssemblyTypes(assemblyList.ToArray())
                .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                .AsSelf().AsImplementedInterfaces()
                .InstancePerLifetimeScope();
        }
    }
}
相关推荐
yyytucj15 分钟前
python--列表list切分(超详细)
linux·开发语言·python
等一场春雨26 分钟前
Java设计模式 八 适配器模式 (Adapter Pattern)
java·设计模式·适配器模式
索然无味io38 分钟前
XML外部实体注入--漏洞利用
xml·前端·笔记·学习·web安全·网络安全·php
肖田变强不变秃44 分钟前
C++实现有限元计算 矩阵装配Assembly类
开发语言·c++·矩阵·有限元·ansys
一弓虽1 小时前
java基础学习——jdbc基础知识详细介绍
java·学习·jdbc·连接池
王磊鑫1 小时前
Java入门笔记(1)
java·开发语言·笔记
ThomasChan1231 小时前
Typescript 多个泛型参数详细解读
前端·javascript·vue.js·typescript·vue·reactjs·js
喜欢猪猪1 小时前
分布式与微服务:构建现代应用的关键架构
开发语言·php
爱学习的狮王1 小时前
ubuntu18.04安装nvm管理本机node和npm
前端·npm·node.js·nvm
硬件人某某某1 小时前
Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
java·开发语言·社区团购小程序·团购小程序·java社区团购小程序