.Net Core / Консольное приложение / Конфигурация / XML

Мое первое небольшое знакомство с библиотеками .Net Core с использованием нового ConfigurationBuilder и шаблона Options.

Здесь много хороших примеров:https://docs.asp.net/en/latest/fundamentals/configuration.html и хорошая копия примераВот

В пункте 1. говорится, что это можно использовать с приложениями, не относящимися к MVC, но нет примеров того, как использовать его без MVC, особенно если вы используете собственный строго типизированный класс.Я хотел бы увидеть пример, показывающий настройку DependencyInjection, Configuration и Logging с помощью консольного приложения.

В пункте 2. говорится, что вы можете написать обратно, но нет примеров или документации о том, как сохранить какие-либо изменения в хранилище файлов.Я хотел бы увидеть пример того, как сохраняются изменения обратно в конфигурацию с использованием строго типизированного класса. В обоих Json или XML?

Пункт 3. Все примеры требуют ручной бомбардировки исходного файла -хотел бы увидеть пример, где исходный файл json / xml создается из строго типизированного класса (пригодится, когда есть много параметров для приложения).

Если я смогу потратить на это достаточно времени (вместо того, чтобы опубликовать пример уже в документации), я сделаю это!Если вы знаете о посте / документации, которая поможет мне, я был бы признателен.

 svick01 авг. 2016 г., 22:45
Вы говорите, что у вас есть вопрос, но я не вижу вопросов, только жалуюсь на отсутствующие примеры. Если вы спрашиваете об этих примерах, то это не то, для чего SO.
 codeputer02 авг. 2016 г., 03:37
Я могу 'найти любые примеры или документацию, которые я ищу, я надеюсь, что другой разработчик может указать мне верное направление или указать мне некоторую документацию.
 Lex Li02 авг. 2016 г., 04:04
Microsoft приветствует сообщество писать такие темы на своих сайтах документации, а также в документации по переполнению стека. Вы можете следить за ними или подать запрос там. Такая быстро движущаяся платформа делает документирование скучным, поэтому я не удивлен, что многие вещи отсутствуют.

Ответы на вопрос(1)

Решение Вопроса

Как настроить консольное приложение .NET Core 1.0.0 для внедрения зависимостей, ведения журналов и настройки?

Многое из того, что было написано, устарело после RC2. (увидетьвопрос). К счастью, есть несколько обновленных сообщений с отличной информацией:

Essential .NET - внедрение зависимостей с помощью .NET Core

Essential .NET - ведение журнала с помощью .NET Core

Я придумал следующее решение. Бьюсь об заклад, есть вещи, которые можно улучшить, пожалуйста, оставьте комментарии, чтобы я мог улучшить этот ответ.

В моемstatic void MainЯ

Настройка зависимости внедрениявзыватьConfigureServicesСоздай свойApplication класс с использованием DIПереключиться с «Синхронизировать главное» на «асинхронной 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: я прочитал документ и, если я что-то упустил, он не говорит, что вы можете написать конфигурацию. Я не уверен, что вы можете сделать это, если вы не редактируете файлы JSON вручную с помощью Newtonsoft.JSON.

Если пара имя / значение записывается в конфигурацию, она не сохраняется. Это означает, что записанное значение будет потеряно при повторном чтении источников.

На ваш вопрос № 3 я включил файл AppSettings.json по умолчанию. В вашем конфиге должен быть раздел, в котором его настройки по имени соответствуют общедоступным свойствам вашего класса настроек.

 Gerardo Grignoli03 авг. 2016 г., 19:42
Конфигурация XML? или это просто данные? Вы можете прочитать это сSystem.Xml.Linq.XDocument также.
 ca9163d929 авг. 2017 г., 00:32
Я получил нулевое значение вvar app = serviceProvider.GetService<Application>(). stackoverflow.com/questions/45928025/...
 zaitsman24 авг. 2017 г., 03:40
Было бы неплохо обновить это для .net core 2.0
 Gerardo Grignoli04 авг. 2016 г., 02:54
 codeputer03 авг. 2016 г., 18:30
Что действительно отсутствует в ссылке Article, так это операторы Using (и соответствующие пакеты NuGet, необходимые) для получения доступа к методам расширения. Извлеченный урок - остерегайтесь методов расширения в ядре .Net!
 codeputer03 авг. 2016 г., 18:31
Все еще борется с чтением из файла XML, в отличие от JSON. Райан Кроуфорд написал в Твиттере, что я добавил .Extention.Configuration.XML, но я получаю исключение UTF-16 (не удалось преобразовать?).
 Gerardo Grignoli03 авг. 2016 г., 19:39
вау, я некоторое время не видел UTF-16 ... Что нужно проверить, это кодировка вашего текстового файла (в блокноте: сохранить как -> Кодировка) и ваш<?xml version="1.0" encoding="ISO-8859-1"?> тег. Я предлагаю начать с простого простого файла XML, созданного с помощью блокнота или vi. (не копируйте вставить, просто введите). Как только это сработает, попробуйте увеличить xml.
 Gerardo Grignoli03 авг. 2016 г., 20:45
Посмотрите пример использования XML-конфигурации здесь:whereslou.com/2014/05/23/...
 codeputer04 авг. 2016 г., 02:49
Gerardo - основываясь на вашем блоге, я избавился от этой ошибки, просто удалив <? Xml version = "1.0" encoding = "utf-16"?> Из верхней части XML. Я создал этот XML, сериализовав класс через XmlSerializXML. Этот класс будет представлять большой конфигурационный файл - один класс с несколькими свойствами - и я хотел бы перегидрировать класс при запуске. Моя теория заключается в том, что если файл не существует, его можно создать, сериализовав класс со значениями по умолчанию.

Ваш ответ на вопрос