.Net Core/控制台应用程序/配置/XML
本文关键字:配置 XML 应用程序 控制台 Core Net | 更新日期: 2023-09-27 17:59:40
我的第一次小冒险。Net Core库使用新的ConfigurationBuilder和Options模式。
这里有很多好例子:https://docs.asp.net/en/latest/fundamentals/configuration.html和一个很好的例子复制这里
项目1。它说这可以与非MVC应用程序一起使用,但没有关于如何在没有MVC的情况下使用它的示例——特别是如果您使用的是自定义的强类型类我想看一个使用Console应用程序显示DependencyInjection、Configuration和Logging设置的示例。
项目2。它说您可以写回,但没有关于如何将任何更改持久化回文件存储的示例或文档我想看一个例子,说明如何使用强类型类将持久化更改回配置中。在Json还是XML中
项目3。所有示例都需要一个手工轰炸的初始文件-希望看到一个示例,其中初始json/xml文件是从强类型类创建的(当应用程序有很多参数时会很方便)。
如果我能在这方面花足够的时间(而不是在文档中重新发布一个例子),我会做的如果你知道有什么帖子/文档可以帮助我,我将不胜感激。
如何配置。NET Core 1.0.0控制台应用程序用于依赖项注入、日志记录和配置
在RC2之后,许多所写的内容都被弃用了。(请参阅问题)。幸运的是,有一些更新的帖子提供了极好的信息:
至关重要。NET的依赖项注入。NET核心
至关重要。NET-使用进行日志记录。NET核心
我想出了以下解决方案。我打赌有些地方可以改进,请留下评论,这样我就可以改进这个答案。
在我的static void Main
,I 中
- 设置依赖项注入
- 调用
ConfigureServices
- 使用DI实例化我的
Application
类 - 从"sync Main"切换到"异步应用程序"。Run()'(对我来说,尽快切换到async并且只切换一次是有意义的。)
关于我的Application
类:
- 我在类构造函数上注入了尽可能多的内容
- 捕获Run()方法上的任何异常
这是代码。
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Configuration;
using System.IO;
public class Program
{
static void Main(string[] args)
{
IServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
// Application application = new Application(serviceCollection);
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
var app = serviceProvider.GetService<Application>();
// For async
Task.Run(() => app.Run()).Wait(); // Exceptions thrown here will be lost! Catch them all at Run()
// Otherwise use sync as in: app.Run();
}
private static void ConfigureServices(IServiceCollection services)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole()
.AddDebug();
services.AddSingleton(loggerFactory); // Add first my already configured instance
services.AddLogging(); // Allow ILogger<T>
IConfigurationRoot configuration = GetConfiguration();
services.AddSingleton<IConfigurationRoot>(configuration);
// Support typed Options
services.AddOptions();
services.Configure<MyOptions>(configuration.GetSection("MyOptions"));
services.AddTransient<Application>();
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: true)
.Build();
}
}
public class MyOptions
{
public string Name { get; set; }
}
public class Application
{
ILogger _logger;
MyOptions _settings;
public Application(ILogger<Application> logger, IOptions<MyOptions> settings)
{
_logger = logger;
_settings = settings.Value;
}
public async Task Run()
{
try
{
_logger.LogInformation($"This is a console application for {_settings.Name}");
}
catch (Exception ex)
{
_logger.LogError(ex.ToString());
}
}
}
}
AppSettings.json文件:
{
"MyOptions": {
"Name" : "John"
}
}
和project.json
文件:
"dependencies": {
"Microsoft.Extensions.Configuration": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.DependencyInjection": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options": "1.0.0",
"Microsoft.Extensions.PlatformAbstractions": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
关于你的问题#2:我已经阅读了文档,除非我遗漏了什么,否则它并没有说你可以写配置。我不确定你是否能做到这一点,除非你使用Newtonsoft手动编辑JSON文件。JSON。
如果名称/值对已写入配置,但未持久化。这表示读取源时写入的值将丢失再一次
对于您的问题#3,我包含了一个默认的AppSettings.json文件。您的配置应该有一个Section,其中它的设置按名称与设置类的公共属性相匹配。