网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Xunit.Abstractions;

namespace Dzp.Core.XunitBasic;

public abstract class Basic
{
    private IServiceProvider? _serviceProvider;
    private readonly IServiceCollection _services;

    protected Basic(ITestOutputHelper testOutputHelper)
    {
        var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.Test.json")
            .Build();
        Configuration = config;
        _services = new ServiceCollection();
        _services.AddSingleton<IConfiguration>(_ => config);
        _services.AddSingleton<HttpClient>(_ => new HttpClient());

        _services
            .AddLogging(builder =>
            {
                builder.AddConfiguration(config);
                builder.AddFilter(null, LogLevel.Debug).AddProvider(new XunitLoggerProvider(testOutputHelper));
            });
    }
    
    protected IServiceProvider ServiceProvider => _serviceProvider ?? throw new Exception("ServiceProvider is null");

    protected IConfiguration Configuration { get; }

    private bool _isBuild = false;
    protected void BuildService(Action<IServiceCollection>? servicesAction = null)
    {
        if (_isBuild) return;
        servicesAction?.Invoke(_services);
        _serviceProvider = _services.BuildServiceProvider();
        _isBuild = true;
    }

    protected void ConfigureServices(Action<IServiceCollection> servicesAction)
    {
        if (_isBuild)
            return;
        servicesAction(_services);
    }

    protected T GetService<T>()
    {
        return ServiceProvider.GetService<T>() ?? throw new Exception($"service {typeof(T).Name} is null,please use method BuildService");
    }

    
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 Basic 的抽象类,主要用于在单元测试中设置和管理依赖注入(DI)容器、配置和日志记录。它使用了 Microsoft.Extensions.DependencyInjectionMicrosoft.Extensions.ConfigurationMicrosoft.Extensions.Logging 等库。以下是代码的主要功能和结构的详细解释:

主要功能

  1. 依赖注入容器的初始化

    • IServiceCollection 用于注册服务和依赖项。
    • IServiceProvider 是构建后的服务提供者,用于解析服务。
  2. 配置管理

    • 使用 ConfigurationBuilderappsettings.Test.json 文件中加载配置,并将其注册为单例服务。
  3. 日志记录

    • 使用 ILogger 接口进行日志记录,配置日志记录器以输出调试级别的日志,并使用 XunitLoggerProvider 将日志输出到 xUnit 的测试输出中。
  4. 服务构建

    • BuildService 方法用于构建服务提供者,确保只构建一次。
    • ConfigureServices 方法允许在构建服务之前添加额外的服务。
  5. 服务解析

    • GetService<T> 方法用于从服务提供者中获取指定类型的服务,如果服务未注册,则抛出异常。

代码结构

  • 构造函数

    • 接受一个 ITestOutputHelper 参数,用于将日志输出到 xUnit 测试框架的输出中。
    • 初始化配置、服务集合,并注册基本服务(如 IConfigurationHttpClient)。
  • 属性

    • ServiceProvider:提供对服务提供者的访问,确保在访问之前已经构建。
    • Configuration:提供对配置的访问。
  • 私有字段

    • _serviceProvider:存储构建后的服务提供者。
    • _services:存储服务集合。
    • _isBuild:标记服务是否已经构建。

使用场景

这个类通常作为其他测试类的基类,提供了一个方便的方式来设置和管理测试所需的依赖项、配置和日志记录。子类可以通过调用 BuildServiceGetService<T> 方法来注册和获取所需的服务,从而简化测试的设置过程。

loading