.NET Core控制台应用程序的ASP.NET核心配置

kim*_*gro 111 c# .net-core

ASP.NET Core支持一个新的配置系统,如下所示:https: //docs.asp.net/en/latest/fundamentals/configuration.html

.NET Core控制台应用程序是否也支持此模型?

如果不是以前app.configConfigurationManager型号的替代品?

Ray*_*ega 185

对于.NET Core 2.0控制台应用程序,我执行了以下操作:

  1. 在项目的根目录下创建一个名为appsettings.json的新文件(文件名可以是任何内容)
  2. 将我的特定设置添加到该文件作为json.例如:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
Run Code Online (Sandbox Code Playgroud)
  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...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后使用以下任一方法读取值:

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);
    
    Run Code Online (Sandbox Code Playgroud)

更多信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration

  • 2注意事项:在第4点,您只需要Microsoft.Extensions.Configuration.Json ...默认情况下它将包含其他2个.第二:如果你想将一个部分加载到一个对象,知道:var options = new FooOptions(); ConfigurationBinder.Bind(configuration.GetSection("foo"),options); 您将需要Microsoft.Extensions.Options.ConfigurationExtensions (10认同)
  • [`IConfigurationRoot`在.NET Core 2.0中仍然可用](https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.configuration.iconfigurationroot?view=aspnetcore-2.0#Applies_to)。它继承自“ IConfiguration”,但被认为是[不常用的派生案例](https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/#lf-content=225842398: 758472358)。无论如何,代码示例已更新为不包含它,并且避免了任何混乱。 (3认同)
  • 工具> NuGet程序包管理器>程序包管理器控制台.. ..安装程序包Microsoft.Extensions.Configuration ..安装程序包Microsoft.Extensions.Configuration.FileExtensions ..安装程序包Microsoft.Extensions.Configuration.Json (2认同)

ali*_*gin 62

您可以使用此代码段.它包括配置和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>();

        ............
    }
}
Run Code Online (Sandbox Code Playgroud)

哦,不要忘记在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"
    ]
  },
...
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案并不理想.使用`Directory.GetCurrentDirectory()`代替`AppContext.BaseDirectory`.之后应该没有必要进行黑客攻击. (11认同)
  • 除非添加“Microsoft.Extensions.Configuration.FileExtensions”,否则似乎没有“SetBasePath”方法。没有“Microsoft.Extensions.Configuration.Json”就没有“AddJsonFile” (4认同)
  • 或者在 Visual Studio 中将 JSON 文件的“复制到输出目录”属性设置为“如果较新则复制”。 (2认同)

Fei*_*hou 15

如果你使用Microsoft.Extensions.Hosting(版本2.1.0+)托管的控制台应用程序和asp.net核心应用程序,所有的配置都注射HostBuilderConfigureAppConfigurationConfigureHostConfiguration方法.这是关于如何添加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
        //;
Run Code Online (Sandbox Code Playgroud)

为了编译上面的代码,你需要添加这些包:

<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" />
Run Code Online (Sandbox Code Playgroud)


Dmi*_*hev 11

如果您使用.netcore 3.1,最简单的方法是使用新的配置系统来调用CreateDefaultBuilder静态类的方法Host并配置应用程序

public class Program
{
    public static void Main(string[] args)
    {
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                IHostEnvironment env = context.HostingEnvironment;
                config.AddEnvironmentVariables()
                    // copy configuration files to output directory
                    .AddJsonFile("appsettings.json")
                    // default prefix for environment variables is DOTNET_
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddCommandLine(args);
            })
            .ConfigureServices(services =>
            {
                services.AddSingleton<IHostedService, MySimpleService>();
            })
            .Build()
            .Run();
    }
}

class MySimpleService : IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("StartAsync");
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("StopAsync");
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要为文件设置 Copy to Output Directory = 'Copy if newer'appsettings.json并且appsettings.{environment}.json 您还可以设置环境变量 {prefix} ENVIRONMENT (默认前缀为 DOTNET)以允许选择特定的配置参数。

.csproj 文件:

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <RootNamespace>ConsoleApplication3</RootNamespace>
  <AssemblyName>ConsoleApplication3</AssemblyName>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.7" />
  <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.7" />
</ItemGroup>

<ItemGroup>
  <None Update="appsettings.Development.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
  <None Update="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

更多详细信息.NET 通用主机


kim*_*gro 10

我误解了.您可以使用ConfigurationBuildernetcore控制台应用程序中的新功能.

有关示例,请参阅https://docs.asp.net/en/latest/fundamentals/configuration.html.

但是,只有aspnet核心具有开箱即用的依赖注入,因此您无法使用强类型配置设置并自动注入它们IOptions.

  • 这个答案是有效的,但它应该包含必要的代码,因此没有upvote. (8认同)
  • 您只需要添加包:`Microsoft.Extensions.Options`并调用`service.AddOptions();` (3认同)
  • 整个(很长)链接页面似乎与 ASP.NET 相关,在每个示例中都提到了“WebHost”。在找到链接页面并思考“好吧,那是 ASP.NET,控制台应用程序怎么样”后,我得到了这个 SO 问题。 (3认同)

Ern*_*est 9

在 .Net Core 3.1 上,我们只需要执行以下操作:

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

使用 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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用于每天生成一个文件的 Serilog appsettings.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"
        }
      }
    ]
  }
Run Code Online (Sandbox Code Playgroud)