using System.Net.Http;
using Dpz.Core.Infrastructure.Intercept;
using Dpz.Core.Service.Network;
using Dpz.Core.Service.ObjectStorage;
using Dpz.Core.Shard.Implement.Service;
using Dpz.Core.Shard.Service;
using Dpz.Core.Web.Library.Api;
using Dpz.Core.Web.Library.Api.Service;
namespace Dpz.Core.Web.Library;
public static class DependencyInjectionExtensions
{
public static IServiceCollection AddInject(this IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddShardCloudFileService();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
});
services.AddScoped<IHomeCacheService, HomeCacheService>();
services.AddScoped<IApplicationSignInManager, ApplicationSignInManager>();
services.AddScoped<
IUserClaimsPrincipalFactory<VmUserInfo>,
UserInfoClaimsPrincipalFactory
>();
services.AddScoped<IChatCurrentUserService, ChatCurrentUserService>();
services.AddHttpClient();
services
.AddHttpClient(
"edge",
httpClient =>
{
httpClient.DefaultRequestHeaders.Add("User-Agent", EnvironmentInfo.UserAgent);
}
)
.ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
});
services
.AddHttpClient(
"WebAPI",
(sp, httpClient) =>
{
var configuration = sp.GetService<IConfiguration>();
var apiAddress =
configuration?["WebApi"] ?? throw new Exception("web api address is null");
httpClient.BaseAddress = new Uri(apiAddress);
}
)
.ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
});
//添加 又拍云储存
services.AddUpyunObjectStorage();
services.AddNetworkServices();
//Steam API
services
.AddHttpClient<ISteamGameService, SteamGameService>(
(_, client) =>
{
client.BaseAddress = new Uri("https://api.steampowered.com");
}
)
.ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (_, _, _, _) => true,
});
services.AddScoped<IVideoShardService, VideoShardService>();
services.AddScoped<ToolService>();
services.AddScoped<GenerateSessionTitleService>();
services.AddScoped<MumbleViewHelper>();
services.AddSingleton<AssetService>();
services.AddInterceptRuleService();
return services;
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个 ASP.NET Core 应用程序的依赖注入配置扩展类,用于注册各种服务和配置 HTTP 客户端。让我详细解释一下这个代码:
类概述
DependencyInjectionExtensions 是一个静态扩展类,提供了 AddInject 扩展方法来集中配置应用程序所需的所有服务。
主要功能分析
1. 基础服务注册
services.AddHttpContextAccessor();
services.AddShardCloudFileService();
- 注册 HTTP 上下文访问器
- 添加分片云文件服务
2. MediatR 配置
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
});
- 配置 MediatR 中介者模式库,用于处理命令和查询
- 自动扫描并注册当前程序集中的处理器
3. 业务服务注册
注册了多个应用程序特定的服务:
IHomeCacheService- 首页缓存服务IApplicationSignInManager- 应用程序登录管理器IUserClaimsPrincipalFactory- 用户声明主体工厂IChatCurrentUserService- 聊天当前用户服务
4. HTTP 客户端配置
默认 HTTP 客户端
services.AddHttpClient();
"edge" 客户端
services.AddHttpClient("edge", httpClient =>
{
httpClient.DefaultRequestHeaders.Add("User-Agent", EnvironmentInfo.UserAgent);
})
- 配置了自定义 User-Agent
- 禁用了 SSL 证书验证(用于开发/测试环境)
"WebAPI" 客户端
services.AddHttpClient("WebAPI", (sp, httpClient) =>
{
var configuration = sp.GetService<IConfiguration>();
var apiAddress = configuration?["WebApi"] ?? throw new Exception("web api address is null");
httpClient.BaseAddress = new Uri(apiAddress);
})
- 从配置中读取 WebAPI 地址并设置为基础地址
- 同样禁用了 SSL 证书验证
Steam API 客户端
services.AddHttpClient<ISteamGameService, SteamGameService>(
(_, client) => { client.BaseAddress = new Uri("https://api.steampowered.com"); }
)
- 专门为 Steam 游戏服务配置的 HTTP 客户端
- 设置 Steam API 为基础地址
5. 其他服务注册
- 又拍云存储服务:
AddUpyunObjectStorage() - 网络服务:
AddNetworkServices() - 业务服务:视频分片、工具服务、会话标题生成等
- 拦截规则服务:
AddInterceptRuleService()
服务生命周期
- Scoped:大部分业务服务使用 Scoped 生命周期,在每个请求中保持单例
- Singleton:
AssetService使用单例模式,在整个应用程序生命周期中只有一个实例
注意事项
⚠️ 安全警告:代码中多处使用了 ServerCertificateCustomValidationCallback = (_, _, _, _) => true,这会跳过 SSL 证书验证。这在生产环境中是不安全的,应该仅在开发/测试环境中使用。
这个扩展方法提供了一个集中的地方来配置应用程序的所有依赖项,使得 Program.cs 或 Startup.cs 更加简洁。
评论加载中...