首页 > 其他分享 >Autofac 实现容器注入

Autofac 实现容器注入

时间:2023-11-24 11:34:28浏览次数:30  
标签:容器 Autofac RegisterType builder optionsBuilder 注册 webBuilder public 注入

using Autofac.Extensions.DependencyInjection;

namespace VOL.WebApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxRequestBodySize = 1024*1024*200;

// Set properties and call methods on options
});
webBuilder.UseKestrel().UseUrls("http://*:9091");//9091
//webBuilder.UseKestrel(o => { o.ListenAnyIP(1883, m => m.UseMqtt()); });//绑定MQTT服务端口
webBuilder.UseIIS();
webBuilder.UseStartup<Startup>();
}).UseServiceProviderFactory(new AutofacServiceProviderFactory());
}
}

Startup.cs

public void ConfigureContainer(ContainerBuilder builder)
{
Services.AddModule(builder, Configuration);
}

public static class AutofacContainerModuleExtension
{

public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration) {     // 初始化配置文件     AppSetting.Init(services, configuration);
    // 获取实现了 IDependency 接口的类型     Type baseType = typeof(IDependency);
    // 获取项目的运行时库     var compilationLibrary = DependencyContext.Default         .RuntimeLibraries         .Where(x => !x.Serviceable && x.Type == "project")         .ToList();
    // 加载运行时库中的程序集     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();
    // 注册 UserContext 类型到容器中     builder.RegisterType<UserContext>().InstancePerLifetimeScope();
    // 注册 ActionObserver 类型到容器中     builder.RegisterType<ActionObserver>().InstancePerLifetimeScope();
    // 注册 ObjectModelValidatorState 类型到容器中     builder.RegisterType<ObjectModelValidatorState>().InstancePerLifetimeScope();
    // 获取数据库连接字符串     string connectionString = DBServerProvider.GetConnectionString(null);
    // 根据数据库类型选择相应的数据库上下文并注册     if (DBType.Name == DbCurrentType.MySql.ToString())     {         // 注册 MySql 数据库上下文         services.AddDbContextPool<VOLContext>(optionsBuilder => { optionsBuilder.UseMySql(connectionString); }, 64);     }     else if (DBType.Name == DbCurrentType.PgSql.ToString())     {         // 注册 PgSql 数据库上下文         services.AddDbContextPool<VOLContext>(optionsBuilder => { optionsBuilder.UseNpgsql(connectionString); }, 64);     }     else     {         // 注册 SqlServer 数据库上下文         services.AddDbContextPool<VOLContext>(optionsBuilder => { optionsBuilder.UseSqlServer(connectionString); }, 64);     }
    // 根据配置选择使用 Redis 缓存服务或内存缓存服务并注册     if (AppSetting.UseRedis)     {         builder.RegisterType<RedisCacheService>().As<ICacheService>().SingleInstance();     }     else     {         builder.RegisterType<MemoryCacheService>().As<ICacheService>().SingleInstance();     }
    // 注册 Kafka 相关的服务     //if (AppSetting.Kafka.UseConsumer)     //    builder.RegisterType<KafkaConsumer<string, string>>().As<IKafkaConsumer<string, string>>().SingleInstance();     //if (AppSetting.Kafka.UseProducer)     //    builder.RegisterType<KafkaProducer<string, string>>().As<IKafkaProducer<string, string>>().SingleInstance();
    return services; }

}




标签:容器,Autofac,RegisterType,builder,optionsBuilder,注册,webBuilder,public,注入
From: https://www.cnblogs.com/huangpy/p/17853361.html

相关文章

  • docker和虚拟化,docker安装和配置, 镜像操作,容器操作
    1docker和虚拟化......
  • c++本质:释放内存、new与delete、容器内是指针
    【释放内存】本质:标识符放弃对该内存的占有权。若该内存是栈内存,当所有标识符都放弃,那么系统自动重获占有权。内存依然存在,地址、值都未改变。若该内存是堆内存,当所有标识符都放弃,不delete,那么系统也无法拥有占有权。所以delete让系统重获占有权。内存依然存在,地址未变、值变为......
  • 【Kubernetes】 容器探针
    【Kubernetes】容器探针Kubernetes提供了探针,通过Kubelet对容器执行定期诊断,以了解容器内应用的状态,以探测结果来决定做哪些操作(比如重启容器、关闭流量),kubernetes中提供了三种探针,分别是就绪探针、存活探针、启动探针,如果不使用探针,默认认为是成功的。每种探针又提供了四种探......
  • sql注入里面用到的语法
    showdatabases;//查看数据库usexxx;//使用某个数据库showtables;//查看该数据库的数据表descxxx;//查看该数据表的结构select*fromxxx;//查找某个数据表的所有内容selectschema_namefrominformation_schema.schemata;//猜数据库selecttable_namefrominfo......
  • 9.9 Windows驱动开发:内核远程线程实现DLL注入
    在笔者上一篇文章《内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,NtCreateThreadEx......
  • SpringBoot注入时设置《多例》
    SpringBoot设置多例1、准备数据测试接口packagecom.cc.jschdemo.springmultiton;/***<p>spring多例测试</p>**@author--*@since2023/11/23*/publicinterfaceISpringMultiton{}测试接口实现(注入spring)packagecom.cc.jschdemo.springmultiton;i......
  • docker 中已经存在的容器修改自启动
    1.修改容器自启动dockerupdate--restart=always容器id2.关闭容器自动dockerupdate--restart=no容器id......
  • Java模版引擎注入(SSTI)漏洞研究
    一、FreeMarker模板注入安全风险0x1:FreeMarker简介FreeMarker是一款Java语言编写的模板引擎,它是一种基于模板和程序动态生成的数据,动态生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组......
  • 如何通过tcpdump在主机上抓取容器的网络报文
    1、首先获取到容器的IDdockerps|grep<容器名称>e.gdockerps|grepprometheus2、通过容器的ID(4e3fbb342ae6)获取容器进程在主机中的PIDdockerinspect-f'{{.State.Pid}}'<容器ID>e.gdockerinspect-f'{{.State.Pid}}'4e3fbb342ae6......
  • SSTI模版注入
    SSTI模版注入模板引擎模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的......