.Net核心/控制台应用程序/配置/ XML

我第一次尝试使用新的ConfigurationBuilder和Options模式进入.Net Core库。

很多很好的例子: https : //docs.asp.net/en/latest/fundamentals/configuration.html和这里的例子的一个很好的副本

第1项。它说这可以用于非MVC应用程序,但没有关于如何在没有MVC的情况下使用它的示例 – 特别是如果您使用的是自定义的强类型类。 我想看一个使用控制台应用程序显示DependencyInjection,Configuration和Logging设置的示例

第2项。它表示您可以回写,但没有关于如何将任何更改保留回文件存储的示例或文档。 我想看一个如何使用强类型类继续更改回配置的示例。 在Json或XML中?

第3项。所有示例都需要手动轰炸的初始文件 – 希望看到一个示例,其中初始json / xml文件是从强类型类创建的 (当应用程序有许多参数时会派上用场)。

如果我可以在这上花足够的时间(而不是重新发布文档中已有的例子),我会做的! 如果您知道有助于我的post/文档,我将不胜感激。

如何为dependency injection,日志记录和配置配置.NET Core 1.0.0控制台应用程序?

在RC2之后,很多写的内容都被弃用了。 (见问题 )。 Fortunatelly有一些更新的post,有很多信息:

Essential .NET – 使用.NET Core进行dependency injection

Essential .NET – 使用.NET Core进行日志记录

我提出了以下解决方案。 我打赌有些事情可以改进,请留下评论,以便我可以改进这个答案。

在我的static void Main ,我

  • 设置dependency injection
  • 调用ConfigureServices
  • 使用DI实例化我的Application
  • 从’sync Main’切换到’ async Application.Run()’(对我来说,尽快切换到异步并且只有一次是有道理的。)

在我的Application类:

  • 我尽可能多地注入类构造函数。
  • 捕获Run()方法上的任何exception。

这是代码。

 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(); // 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 IConfigurationRoot configuration = GetConfiguration(); services.AddSingleton(configuration); // Support typed Options services.AddOptions(); services.Configure(configuration.GetSection("MyOptions")); services.AddTransient(); } 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 logger, IOptions 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文件,否则我不确定您是否可以这样做。

如果将名称/值对写入Configuration,则不会保留该名称/值对。 这意味着当再次读取源时,写入的值将丢失。

对于您的问题#3,我已经包含了一个默认的AppSettings.json文件。 您的配置应该有一个部分,其设置与名称匹配您的设置类的公共属性。