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

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

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

пункт 1. в нем говорится, что это можно использовать с приложениями, отличными от MVC, но нет примеров использования без MVC - особенно если вы используете пользовательский строго типизированный класс. I хотелось бы увидеть пример показа настройки DependencyInjection, конфигурации и ведения журнала С помощью консольного приложения.

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

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

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

1 ответов


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

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

Essential .NET-инъекция зависимостей с .NET Core

Essential .NET-ведение журнала с .NET Core

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

в своем static void Main, Я

  • настройка инъекции зависимостей
  • Invoke ConfigureServices
  • создать экземпляр my Application класс с помощью DI
  • переключиться с 'Sync Main 'на'асинхронные приложение.Работать')( (Мне имеет смысл переключиться на 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"
  }
}

и :

 "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.

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

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