如何在控制台应用程序中实现 IConfiguration 依赖注入

发布:2024-09-13 11:19 阅读:22 点赞:0

在 ASP.NET Core Web 主机或 .NET 通用主机中,IConfiguration 是默认构建器设置的一部分,通过依赖注入可以在应用程序的任何位置访问配置设置。然而,在控制台应用程序中,我们需要采取一些额外步骤来实现相同的功能。

一. 控制台应用程序的默认设置

在默认情况下,ASP.NET Core 控制台应用程序不自动包含 IConfiguration。如果应用程序本身是一个服务,你可以使用以下方法来构建和运行应用程序。

1.1 初始控制台应用程序示例

internal class Program
{
    static async Task Main(string[] args)
    {
        var services = CreateServices(); // 创建服务提供者
        ConsoleApp app = services.GetRequiredService<ConsoleApp>(); // 获取 ConsoleApp 实例
        await app.Run(); // 运行应用程序
    }

    private static ServiceProvider CreateServices()
    {
        var serviceProvider = new ServiceCollection()
            .AddLogging(options =>
            {
                options.ClearProviders(); // 清除默认日志提供者
                options.AddConsole(); // 添加控制台日志提供者
            })
            .AddSingleton<ImportService>() // 注册 ImportService
            .AddSingleton<ConsoleApp>() // 注册 ConsoleApp
            .BuildServiceProvider(); // 构建服务提供者
        return serviceProvider;
    }
}

代码解释:

  • CreateServices 方法创建并配置 ServiceCollection,添加了日志服务和两个自定义服务 ImportService 和 ConsoleApp
  • ServiceCollection 用于构建 ServiceProvider,该提供者用于依赖注入。

当使用这种方法时,IConfiguration 不会自动包含在内,无法通过依赖注入访问应用程序配置设置。

二. 扩展 CreateServices 方法以支持 IConfiguration

为了使 IConfiguration 可用于依赖注入,我们需要在 CreateServices 方法中进行如下扩展:

2.1 修改 CreateServices 方法

private static ServiceProvider CreateServices()
{
    // 使用 ConfigurationBuilder 创建并配置配置对象
    var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); // 添加配置文件
    IConfiguration configuration = builder.Build(); // 构建配置对象

    var serviceProvider = new ServiceCollection()
        .AddLogging(options =>
        {
            options.ClearProviders(); // 清除默认日志提供者
            options.AddConsole(); // 添加控制台日志提供者
        })
        .AddSingleton<IConfiguration>(_ => configuration) // 将 IConfiguration 对象注册到服务集合中
        .AddSingleton<ImportService>() // 注册 ImportService
        .AddSingleton<ConsoleApp>() // 注册 ConsoleApp
        .BuildServiceProvider(); // 构建服务提供者

    return serviceProvider;
}

代码解释:

  • ConfigurationBuilder 用于从 appsettings.json 文件中加载配置。
  • 创建 IConfiguration 对象并将其注册到 ServiceCollection 中,这样在需要的地方可以通过依赖注入访问应用程序的配置设置。

三. 通过依赖注入使用 IConfiguration

在需要 IConfiguration 的类中,通过构造函数注入可以访问配置设置:

3.1 示例:ImportService 类

public class ImportService
{
    private readonly IConfiguration _configuration; // 配置对象
    private readonly ILogger<ImportService> _logger; // 日志对象

    public ImportService(IConfiguration configuration, ILogger<ImportService> logger)
    {
        this._logger = logger; // 初始化日志对象
        this._configuration = configuration; // 初始化配置对象
    }

    // 其他方法和功能
}

代码解释:

  • ImportService 类通过构造函数注入 IConfiguration 和 ILogger<ImportService> 对象。
  • 这样可以在 ImportService 中使用配置设置和日志功能。

四. 总结

通过以上调整,我们可以在控制台应用程序中使用 IConfiguration 来访问应用程序配置设置,类似于在 ASP.NET Core Web 应用程序中使用 IConfiguration 的方式。将 IConfiguration 注册到服务集合中并通过依赖注入使用,可以让控制台应用程序中的服务也能方便地访问配置信息。