using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using QYZH.InteractiveMagazine.Infrastructure.Cache; using QYZH.InteractiveMagazine.Infrastructure.MessageQueue; using QYZH.InteractiveMagazine.Infrastructure.Middleware; using QYZH.InteractiveMagazine.Models.Settings; using RabbitMQ.Client; using StackExchange.Redis; using System.Text; namespace QYZH.InteractiveMagazine.Infrastructure.Extensions; /// /// 统一服务注册扩展 /// public static class DependencyInjectionExtensions { /// /// 注册基础设施服务 /// /// 服务集合 /// 配置 public static void AddInfrastructureServices(this IServiceCollection services, IConfiguration configuration) { AddJwtAuthentication(services, configuration); AddRedisCache(services, configuration); AddRabbitMQ(services, configuration); services.AddTransient(); services.AddTransient(); } /// /// 配置JWT认证 /// /// 服务集合 /// 配置 private static void AddJwtAuthentication(IServiceCollection services, IConfiguration configuration) { var jwtSettings = configuration.GetSection("JwtSettings").Get()!; services.AddSingleton(jwtSettings); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = jwtSettings.Issuer, ValidateAudience = true, ValidAudience = jwtSettings.Audience, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey!)), ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; }); } /// /// 注册Redis缓存 /// /// 服务集合 /// 配置 private static void AddRedisCache(IServiceCollection services, IConfiguration configuration) { var redisSettings = configuration.GetSection("RedisSettings").Get()!; services.AddSingleton(redisSettings); services.AddSingleton(sp => { var multiplexer = ConnectionMultiplexer.Connect(redisSettings.ConnectionString!); RedisHelper.Connection = multiplexer; RedisHelper.SetKeyPrefix(redisSettings.InstanceName!); return multiplexer; }); } /// /// 注册RabbitMQ /// /// 服务集合 /// 配置 private static void AddRabbitMQ(IServiceCollection services, IConfiguration configuration) { var rabbitMQSettings = configuration.GetSection("RabbitMQSettings").Get()!; services.AddSingleton(rabbitMQSettings); services.AddSingleton(sp => { var factory = new ConnectionFactory { HostName = rabbitMQSettings.HostName!, Port = rabbitMQSettings.Port, UserName = rabbitMQSettings.UserName!, Password = rabbitMQSettings.Password!, VirtualHost = rabbitMQSettings.VirtualHost! }; return factory.CreateConnectionAsync().GetAwaiter().GetResult(); }); services.AddTransient(); } }