web-dev-qa-db-ja.com

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

ここに見られるようにASP.NETコアは新しい構成システムをサポートします: https://docs.asp.net/en/latest/fundamentals/configuration.html

このモデルは.NET Coreコンソールアプリケーションでもサポートされていますか?

そうでない場合は、前のapp.configおよびConfigurationManagerモデルに代わるものは何ですか?

100
kimsagro

このコードスニペットを使うことができます。構成と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"
    ]
  },
...
}
56
aligin

.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/ja-jp/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration

159
Ray Vega

Microsoft.Extensions.Hosting(バージョン2.1.0以降)を使用してコンソールアプリとasp.netコアアプリをホストする場合、すべての設定にHostBuilderConfigureAppConfigurationおよびConfigureHostConfigurationメソッドが注入されます。これは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" />
14
Feiyu Zhou

私は間違えました。あなたはnetcoreコンソールアプリケーションから新しいConfigurationBuilderを使うことができます。

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

ただし、aspnetコアだけが箱から出してすぐに依存性注入を行うので、厳密に型付けされた構成設定を持ち、IOptionsを使用して自動的に注入することはできません。

9
kimsagro

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に注入することができます。

0
lnaie
var directoryInfo = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).FullName;
            var builder = new ConfigurationBuilder()
                .SetBasePath(directoryInfo)
                .AddJsonFile("appsettings.json",  true, true)
                .Build();
0
Hakobyan Vanik