【问题标题】:.Net Core / Console Application / Configuration / XML.Net Core / 控制台应用程序 / 配置 / XML
【发布时间】:2016-12-07 00:18:19
【问题描述】:

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

这里有很多很好的例子:https://docs.asp.net/en/latest/fundamentals/configuration.html 以及一个很好的例子here

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

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

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

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

【问题讨论】:

  • 你说你有问题,但我没有看到任何问题,只是抱怨缺少示例。如果您要这些示例,那么这不是 SO 的用途。
  • 我找不到任何我正在寻找的示例或文档,我希望其他开发人员可以为我指出正确的方向,或者为我指出一些文档。
  • Microsoft 欢迎社区在其文档站点以及 Stack Overflow 文档上撰写此类主题。您可能会关注他们或在那里提出请求。像这样一个快速移动的平台让记录变得很无聊,所以我对丢失很多东西并不感到惊讶。

标签: c# configuration console-application .net-core


【解决方案1】:

如何配置 .NET Core 1.0.0 控制台应用程序以进行依赖注入、日志记录和配置?

很多内容在 RC2 之后已被弃用。 (见issue)。 幸运的是,有一些更新的帖子提供了很好的信息:

Essential .NET - Dependency Injection with .NET Core

Essential .NET - Logging with .NET Core

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

在我的static void Main,我

  • 设置依赖注入
  • 调用ConfigureServices
  • 使用 DI 实例化我的 Application
  • 从 'sync Main' 切换到 'async Application.Run()' (对我来说,尽快切换到异步是有意义的,而且只有一次。)

在我的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 文件。您的配置应该有一个部分,其设置按名称与您的设置类的公共属性匹配。

【讨论】:

  • 文章链接中真正缺少的是使用语句(以及所需的相关 NuGet 包)来访问扩展方法。经验教训 - 警惕 .Net 核心中的扩展方法!
  • 仍然在努力从 XML 文件中读取,而不是 JSON。 Ryan Crawford 在推特上向我发送了包含 .Extention.Configuration.XML 的信息,但我收到了 UTF-16 异常(无法转换?)。
  • 哇,我已经有一段时间没有看到 UTF-16 了……要检查的是您的文本文件编码(在记事本上:另存为 -> 编码)和您的 &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; 标签。我建议先从使用记事本或 vi 创建的简单 XML 文件开始。 (不要复制粘贴,只需输入)。一旦工作正常,请尝试增加 xml。
  • 是XML配置吗?还是只是数据?您也可以使用System.Xml.Linq.XDocument 阅读。
  • 如果能更新 .net core 2.0 就好了
猜你喜欢
  • 2016-11-02
  • 1970-01-01
  • 2018-09-12
  • 2018-02-16
  • 2020-07-14
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多