簡體   English   中英

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

[英].Net Core / Console Application / Configuration / 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文件是從強類型類創建的 (當應用程序有許多參數時會派上用場)。

如果我可以在這上花足夠的時間(而不是重新發布文檔中已有的例子),我會這樣做的! 如果您知道有助於我的帖子/文檔,我將不勝感激。

如何為依賴注入,日志記錄和配置配置.NET Core 1.0.0控制台應用程序?

在RC2之后,很多寫的內容都被棄用了。 (見問題 )。 Fortunatelly有一些更新的帖子,有很多信息:

Essential .NET - 使用.NET Core進行依賴注入

Essential .NET - 使用.NET Core進行日志記錄

我提出了以下解決方案。 我打賭有些東西可以改進,請留下評論,以便我可以改進這個答案。

在我的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文件。 您的配置應該有一個部分,其設置與名稱匹配您的設置類的公共屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM