如何在控制台应用中像ASP.NET Core那样依赖注入绑定JSON到类
控制台应用实现ASP.NET Core风格依赖注入与配置绑定的修正方案
原代码无法运行的核心问题在于没有通过依赖注入容器解析控制器实例,而是直接new对象,导致构造函数依赖的IOptions<entityClass>无法被注入;同时存在配置文件路径硬编码、属性调用错误等问题。以下是符合ASP.NET Core风格的修正代码:
修正后的实体类(遵循C#命名规范)
public class EntityClass { public string Id { get; set; } public string Os { get; set; } }
appsettings.json(注意文件名拼写,确保复制到输出目录)
{ "Key1": { "Id": "4", "Os": "XP" } }
完整控制台程序代码
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; class Program { static void Main(string[] args) { // 构建配置对象,使用当前程序运行目录,避免硬编码路径 IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); // 注册依赖注入服务 ServiceCollection services = new ServiceCollection(); // 绑定配置到EntityClass services.Configure<EntityClass>(configuration.GetSection("Key1")); // 注册控制器类到DI容器 services.AddTransient<ClassController>(); // 构建服务提供者 using (var serviceProvider = services.BuildServiceProvider()) { // 从DI容器获取控制器实例 var controller = serviceProvider.GetRequiredService<ClassController>(); // 获取配置实体并输出 var entity = controller.YMethod(); Console.WriteLine($"{entity.Id}==>{entity.Os}"); } } } class ClassController { private readonly IOptions<EntityClass> _entity; // 构造函数注入IOptions<EntityClass> public ClassController(IOptions<EntityClass> entity) { _entity = entity; } public EntityClass YMethod() { return _entity.Value; } }
关键注意事项
- 配置文件复制设置:右键项目中的
appsettings.json→ 属性 → 复制到输出目录选择「如果较新则复制」,确保程序运行时能读取到配置文件。 - 依赖注入核心流程:注册服务 → 构建
ServiceProvider→ 从容器解析实例,这是ASP.NET Core中DI的标准流程,控制台应用需要手动完成这些步骤(ASP.NET Core框架会自动处理)。 - 命名规范:实体类和属性采用大驼峰命名,符合C#编码规范,同时配置文件中的键名建议与类属性名一致(配置绑定支持大小写不敏感,但保持一致更清晰)。
内容的提问来源于stack exchange,提问作者Yasim Yasin
相关产品推荐
相关产品推荐

