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 生命周期,在每个请求中保持单例
  • SingletonAssetService 使用单例模式,在整个应用程序生命周期中只有一个实例

注意事项

⚠️ 安全警告:代码中多处使用了 ServerCertificateCustomValidationCallback = (_, _, _, _) => true,这会跳过 SSL 证书验证。这在生产环境中是不安全的,应该仅在开发/测试环境中使用。

这个扩展方法提供了一个集中的地方来配置应用程序的所有依赖项,使得 Program.csStartup.cs 更加简洁。

评论加载中...