2016-08-01 58 views
9

我使用新的ConfigurationBuilder和Options模式對.NET核心庫進行了第一次小小的冒險。.Net核心/控制檯應用程序/配置/ XML

的優秀範例地塊的:https://docs.asp.net/en/latest/fundamentals/configuration.html 和例子here

項目1.它說,這可與非MVC應用程序中使用的一個很好的副本,但對如何使用它沒有MVC沒有例子 - 特別是如果您正在使用自定義的強類型類。 我希望看到一個使用控制檯應用程序顯示DependencyInjection,Configuration和Logging設置的示例。

項目2.它表示您可以回寫,但沒有關於如何將任何更改保留迴文件存儲的示例或文檔。 我想看看如何使用強類型的類持久化回到配置的例子。在Json還是XML中?

項目3.所有示例需要一隻手被炸初始文件 - 想看到從一個強類型類創建初始JSON/xml文件的例子(派上用場的時候有許多參數應用程序)。

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

+0

你說你有問題,但我沒有看到任何問題,只抱怨缺失的例子。如果你要求這些例子,那麼這不是什麼意思。 – svick

+0

我可以找到任何我想要的示例或文檔,我希望另一位開發人員能夠指引我正確的方向,或者指向我一些文檔。 – codeputer

+0

Microsoft歡迎社區在其文檔站點以及Stack Overflow文檔中撰寫這些主題。您可以留意他們或在那裏提出要求。像這樣一個快速移動的平臺讓文檔變得無聊,所以我並不感到驚訝,許多事情都缺失了。 –

回答

19

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

很多寫的內容在RC2之後棄用。 (見issue)。 Fortunatelly有一些更新的帖子與外觀極好信息:

Essential .NET - Dependency Injection with .NET Core

Essential .NET - Logging with .NET Core

我想出了以下解決方案。我敢打賭,有些事情可以改進,請留下評論,以便我可以改進這個答案。

以我static void Main,我

  • 設置依賴注入使用DI
  • 調用ConfigureServices
  • 實例化我Application類 從 '同步主'
  • 轉爲「異步 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文件。你的配置應該有一個部分,其設置的名稱與設置類的公共屬性相匹配。

+0

Article鏈接中真正缺少的是Using語句(以及相關的NuGet包需要)來訪問擴展方法。獲得的教訓 - 對.Net核心的擴展方法保持警惕! – codeputer

+0

仍在與XML文件讀取相對,而不是JSON。瑞安克勞馥推送我包括.Extention.Configuration.XML,但我得到一個UTF-16異常(無法轉換?)。 – codeputer

+0

哇我沒有看到一段時間的UTF-16 ...要檢查的是你的文本文件編碼(在記事本上:另存爲 - >編碼)和你的'<?xml version =「1.0」encoding =「ISO-8859- 1「?>'標籤。我建議首先使用記事本或vi創建一個簡單的簡單XML文件。 (不要複製粘貼,只需鍵入)。一旦工作,嘗試增加xml。 –

相關問題