.NET CoreコンソールアプリケーションのASP.NET Core構成


回答:


76

このコードスニペットを使用できます。これには、構成とDIが含まれます。

public class Program
{
    public static ILoggerFactory LoggerFactory;
    public static IConfigurationRoot Configuration;

    public static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;

        string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        if (String.IsNullOrWhiteSpace(environment))
            throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");

        Console.WriteLine("Environment: {0}", environment);

        var services = new ServiceCollection();

        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(AppContext.BaseDirectory))
            .AddJsonFile("appsettings.json", optional: true);
        if (environment == "Development")
        {

            builder
                .AddJsonFile(
                    Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
                    optional: true
                );
        }
        else
        {
            builder
                .AddJsonFile($"appsettings.{environment}.json", optional: false);
        }

        Configuration = builder.Build();

        LoggerFactory = new LoggerFactory()
            .AddConsole(Configuration.GetSection("Logging"))
            .AddDebug();

        services
            .AddEntityFrameworkNpgsql()
            .AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);

        services.AddTransient<IPackageFileService, PackageFileServiceImpl>();

        var serviceProvider = services.BuildServiceProvider();

        var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();

        ............
    }
}

ああ、そしてproject.jsonに追加することを忘れないでください

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
      "includeFiles": [
        "appsettings.json",
        "appsettings.Integration.json",
        "appsettings.Production.json",
        "appsettings.Staging.json"
      ]
    }
  },

  "publishOptions": {
    "copyToOutput": [
      "appsettings.json",
      "appsettings.Integration.json",
      "appsettings.Production.json",
      "appsettings.Staging.json"
    ]
  },
...
}

12
この答えは理想的ではありません。のDirectory.GetCurrentDirectory()代わりに使用しますAppContext.BaseDirectory。後でハックする必要はないはずです。
Matyas 2017

1
または、Visual StudioでJSONファイルの[出力ディレクトリにコピー]プロパティを[新しい場合はコピー]に設定します。
BuddhiP

ウェブでの仕事にベースディレクトリの場合は、コンソールとのWinformsあなたは、このアプローチを使用することができますstackoverflow.com/a/33675039/1818723
パヴェルCioch

ゲイリー・ウッドファインは、この投稿で非常に良いスタイルでこれを詳細に説明しました:garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi

@javad一部のみ。私がここにたどり着いたのは、彼が約束したDI部品が欲しかったので見つかりませんでした。また、この例のように複数の構成ファイルを使用する方法も示していません。
-Auspex

232

.NET Core 2.0コンソールアプリの場合、私は次のことを行いました。

  1. appsettings.jsonという名前の新しいファイルを作成しますプロジェクトのルートに(ファイル名は任意です)
  2. 特定の設定をjsonとしてそのファイルに追加します。例えば:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. プロジェクトがビルドされるたびにファイルを出力ディレクトリにコピーするように構成します(VSで->ソリューションエクスプローラー->ファイルを右クリック-> [プロパティ]を選択-> [詳細]-> [出力ディレクトリにコピー]-> [常にコピー]を選択)

  2. プロジェクトに次のnugetパッケージをインストールします。

    • Microsoft.Extensions.Configuration.Json
  3. 以下をProgram.cs(またはどこMain()にあるか)に追加します。

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. 次に、以下のいずれかの方法を使用して値を読み取ります。

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);

詳細:https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
私が気づいたように、MicrosoftはサンプルでIConfigurationRootを使用していませんが、IConfigurationを使用しています。
aligin 2017

3
IConfigurationRoot.NET Core 2.0でも引き続き使用できます。それは継承されますIConfigurationが、一般的には使用されない派生ケースと見なさます。いずれにしても、コード例はコード例を含まず、混乱を避けるために更新されました。
Ray

10
2つの注記:ポイント4では、Microsoft.Extensions.Configuration.Jsonだけが必要です...デフォルトでは、残りの2つが含まれます。2番目:オブジェクトにセクションをロードする場合、次のことを知っておくと便利です。var options = new FooOptions(); ConfigurationBinder.Bind(configuration.GetSection( "foo")、options); Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
public class FooOptions {public string myKey1 {get; set;} public string myKey2 {get; set;}}
Yepeekai

2
ツール> NuGetパッケージマネージャー>パッケージマネージャーコンソール.. .. Install-Package Microsoft.Extensions.Configuration .. Install-Package Microsoft.Extensions.Configuration.FileExtensions .. Install-Package Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

あなたが使用している場合はMicrosoft.Extensions.Hosting、あなたのコンソールアプリケーションとasp.netコアアプリケーションをホストする(バージョン2.1.0+)、すべての構成がで注入されHostBuilderさんConfigureAppConfigurationConfigureHostConfiguration方法。appsettings.jsonと環境変数を追加する方法についてのデモは次のとおりです。

    var hostBuilder = new HostBuilder()
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                // enviroment from command line
                // e.g.: dotnet run --environment "Staging"
                config.AddCommandLine(args);
            }
        })
        .ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            // Override config by env, using like Logging:Level or Logging__Level
            .AddEnvironmentVariables();

        })
        ... // add others, logging, services
        //;

上記のコードをコンパイルするには、次のパッケージを追加する必要があります。

<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />

環境はどのように決定されますか?launchSettingsでプロファイルを作成すると、実際には設定されますASPNETCORE_ENVIRONMENTが、context.HostingEnvironment.EnvironmentName正しく設定されません
Sinaesthetic

:あなたはこのコードをチェックし、キーとして環境を使用する必要がありますgithub.com/aspnet/Hosting/blob/dev/src/...
Feiyu周

@FeiyuZhouデッドリンク
Auspex

このソリューションのすべてnew HostBuilder()冗長になった後ではありませんか?HostBuilder社内ですべてやってみませんか?
Auspex

@Auspexコンソールアプリの定義方法によって異なります。カスタム構成を定義する必要がある場合は、このように設定する必要があります。ここではDOTNETコア3.0のドキュメントです:docs.microsoft.com/en-us/aspnet/core/fundamentals/host/...
Feiyu周

10

間違えた。ConfigurationBuildernetcoreコンソールアプリケーションから新規を使用できます。

例については、https://docs.asp.net/en/latest/fundamentals/configuration.htmlを参照してください

ただし、依存関係のインジェクションはaspnetコアにのみあり、厳密に入力された構成設定を使用して、を使用してそれらを自動的にインジェクトすることはできませんIOptions


9
この回答は有効ですが、必要なコードが含まれている必要があるため、賛成票はありません。
Matyas 2017

4
必要なのは、パッケージを追加することだけです。Microsoft.Extensions.Optionsそして、電話service.AddOptions();
Bruno Garcia

2
リンクされたページ全体(非常に長い)はASP.NETに関連しているようで、すべての例で「WebHost」に言及しています。リンクされたページを見つけて「OK、それはASP.NETです。コンソールアプリはどうですか」と思った後、私はこのSOの質問に行きました。
マッケニル

@mackenirは少し奇妙です。3.0ではすべてリファクタリングされ、すべてHostになっているからです。WebHost自体への唯一の参照は、2.2のドキュメントを参照することです。これらConfigureWebHostDefaults()の例の呼び出しはオプションであり、Webアプリに対してのみであることを少し明確にすることができます。
Auspex

4

dotnet 2.xコアコンソールアプリケーションの場合、次のようになります。

        using Microsoft.Extensions.Configuration;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;

        [...]
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
        var serviceProvider = new ServiceCollection()
            .AddLogging(options => options.AddConfiguration(configuration).AddConsole())
            .AddSingleton<IConfiguration>(configuration)
            .AddSingleton<SomeService>()
            .BuildServiceProvider();
        [...]
        await serviceProvider.GetService<SomeService>().Start();

ILoggerFactory、IConfigurationをに挿入できますSomeService


2

.Net Core 3.1では、次のことを行う必要があります。

static void Main(string[] args)
{
  var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}

SeriLogを使用すると、次のようになります。

using Microsoft.Extensions.Configuration;
using Serilog;
using System;


namespace yournamespace
{
    class Program
    {

        static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();

            try
            {
                Log.Information("Starting Program.");
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Program terminated unexpectedly.");
                return;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

そして、毎日1つのファイルを生成するSerilog appsetings.jsonセクションは次のようになります。

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Logs\\Program.json",
          "rollingInterval": "Day",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }

Web全体からこれらの構文をすべて試した後、あなたの構文が私にとってうまくいったものであり、それはとても簡単です。
GaneshT

お役に立てて嬉しいです。
アーネスト

1

そのためにLiteWare.Configurationライブラリを使用できます。元の.NET Frameworkとよく似てConfigurationManagerおり、.NET Core / Standardで動作します。コード的には、次のような結果になります。

string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");

免責事項:私はLiteWare.Configurationの作成者です。


0

積み重ねるだけ... Feiyu Zhouの投稿に似ています。ここでは、マシン名を追加しています。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
          .ConfigureAppConfiguration((context, builder) =>
          {
            var env = context.HostingEnvironment;
            var hostname = Environment.MachineName;
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
              .AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
            builder.AddEnvironmentVariables();
            if (args != null)
            {
              builder.AddCommandLine(args);
            }
          })
        .UseStartup<Startup>();
  }

0

これらのパッケージをインストールします。

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

コード:

static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
        Console.WriteLine("ENVIRONMENT: " + environmentName);

        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", false)
           .AddJsonFile($"appsettings.{environmentName}.json", true)
           .AddEnvironmentVariables();

        IConfigurationRoot configuration = builder.Build();
        var mySettingsConfig = configuration.Get<MySettingsConfig>();

        Console.WriteLine("URL: " + mySettingsConfig.Url);
        Console.WriteLine("NAME: " + mySettingsConfig.Name);

        Console.ReadKey();
    }

MySettingsConfigクラス:

public class MySettingsConfig
{
    public string Url { get; set; }
    public string Name { get; set; }
}

アプリの設定は次のように簡単にすることができます。 ここに画像の説明を入力してください

また、新しい場合はappsettingsファイルをContent / Copyに設定します。 コンテンツ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.