2016-08-01 7 views
9

新しいConfigurationBuilderとOptionsパターンを使用した.Net Coreライブラリへの私の最初の少しのベンチャー。.Net Core/Console Applicatin/Configuration/XML

ロトの良いここに例の:https://docs.asp.net/en/latest/fundamentals/configuration.html と例の良いコピーhere

項目1.これは非MVCアプリケーションが、MVCなしでそれを使用する方法の無い例で使用することができると言う - 特に厳密に型指定されたカスタムクラスを使用している場合Consoleアプリケーションを使用して、DependencyInjection、Configuration、およびLoggingの設定を表示する例を見ていきたいと思います。

項目2.書き戻しはできますが、変更をファイルストアに保持する方法の例やドキュメントはありません。 厳密に型指定されたクラスを使用して永続的な変更がコンフィグレーションにどのように反映されるかの例を見たいと思います。 JsonやXMLの両方で? 3.すべての例には手が初期ファイル爆撃必要

アイテム - のための多くのパラメータがある場合は初期JSON/XMLファイルは、厳密に型指定されたクラス(から作成された例を見てみたいが便利ですアプリケーション)。

私はこれに十分な時間を費やすことができます(既に文書に例を再掲載するのではなく)私はそれをやります! あなたが私を助けるポスト/ドキュメントを知っていれば、私はそれを感謝します。

+0

あなたはあなたに質問があると言いますが、質問はありません。不足している例についてのみ不平を言います。あなたがそれらの例を求めているなら、それはSOのためではありません。 – svick

+0

私が探しているサンプルやドキュメントを見つけることができます。別の開発者が私に正しい方向を向けることができると願っています。 – codeputer

+0

マイクロソフトでは、このドキュメントのサイトやスタックオーバーフローのドキュメントにこのようなトピックを書き込むことをコミュニティに歓迎しています。あなたはそれらを見守ったり、そこでリクエストをしたりするかもしれません。このように速く動くプラットフォームは、それを退屈なものにするので、多くのことが欠落していることに驚くことはありません。 –

答えて

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

、I

  • セットアップ依存性の注入
  • 起動ConfigureServices
  • は "非同期 Application.Run(への '同期メイン' からDI
  • スイッチを使用して、私のApplicationクラスをインスタンス化) ' (できるだけ早く非同期に切り替えるのは1回だけです)
  • 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ファイル:あなたの質問#2の

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

:私は、ドキュメントを読んで、私は何かが欠けていない限り、 、それはあなたが設定を書くことができるとは言わない。 Newtonsoft.JSONを使用してJSONファイルを手動で編集しない限り、あなたがそれを行うことができるかどうかはわかりません。

名前/値のペアがConfigurationに書き込まれても、それは永続化されません。この は、ソースが再度読み取られたときに書き込まれた値が失われることを意味します。

私の質問には、デフォルトのAppSettings.jsonファイルが含まれています。あなたの設定には、その設定が設定クラスのパブリックプロパティに名前で一致するセクションが必要です。

+0

Articleリンクから実際には分かりませんが、Usingメソッド(および関連するNuGetパッケージが必要です)が拡張メソッドにアクセスできます。レッスンで学んだことは、.NETコアの拡張メソッドに注意してください! – codeputer

+0

JSONとは対照的に、依然としてXMLファイルからの読み込みで戦っています。 Ryan Crawfordは私に.Extention.Configuration.XMLを組み込むようにツイートしましたが、UTF-16例外が発生しました(変換できません)。 – codeputer

+0

しばらくの間、UTF-16で見たことがないのです...テキストファイルのエンコード(メモ帳で:エンコーディングとして保存)と '<?xml version =" 1.0 "encoding =" ISO-8859- 1 "?>'タグ。最初にメモ帳やviで作成した単純なXMLファイルから始めてみることをお勧めします。 (貼り付けはしないで、入力してください)。それが機能したら、xmlを増やしてみてください。 –