如何在控制台应用程序中实现 IConfiguration 依赖注入
阅读:23
点赞: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
注册到服务集合中并通过依赖注入使用,可以让控制台应用程序中的服务也能方便地访问配置信息。