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


Answers:


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

1
或在Visual Studio中将JSON文件的“复制到输出目录”属性设置为“如果更新则复制”。
BuddhiP

为了使基本目录能够在Web,控制台和Winforms中工作,您可以使用此方法stackoverflow.com/a/33675039/1818723
Pawel Cioch,2018年

加里·伍德芬(Gary Woodfine)在这篇文章中以非常好的风格对此进行了详细描述:garywoodfine.com/configuration-api-net-core-console-application
Javad Norouzi

@javad仅部分;我到这里结束是因为我想要DI部分,他答应过,但没有找到。他也没有像本示例一样显示如何使用多个配置文件。
Auspex19年

230

对于.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/zh-cn/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
正如我注意到的,Microsoft在示例中不使用IConfigurationRoot,而是使用IConfiguration。
阿利金

3
IConfigurationRoot在.NET Core 2.0中仍然可用。它继承自,IConfiguration但被认为它的派生案例,并不常用。无论如何,代码示例已更新为不包含它,并避免了任何混乱。

10
2个注意事项:在第4点上,您只需要Microsoft.Extensions.Configuration.Json ...默认情况下将包括其他2个。第二:如果要将段加载到对象,了解以下信息将很有用:var options = new FooOptions(); ConfigurationBinder.Bind(configuration.GetSection(“ foo”),options); 您将需要Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai,

1
公共类FooOptions {公共字符串myKey1 {get; set;} public string myKey2 {get; set;}}
Yepeekai

2
工具> NuGet程序包管理器>程序包管理器控制台.. ..安装程序包Microsoft.Extensions.Configuration.FileExtensions ..安装程序包Microsoft.Extensions.Configuration.Json
Manohar Reddy Poreddy

19

如果您使用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
        //;

为了编译以上代码,您需要添加以下软件包:

<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/...
飞宇周

@FeiyuZhou这是一个死链接
Auspex

难道不是所有这些解决方案都是new HostBuilder()多余的吗?不HostBuilder内部全部完成吗?
Auspex19年

@Auspex这取决于您如何定义控制台应用程序。如果需要定义自定义配置,则应这样设置。下面是DOTNET核心3.0 DOC:docs.microsoft.com/en-us/aspnet/core/fundamentals/host/...
飞宇周

10

我错了。您可以ConfigurationBuilder从netcore控制台应用程序中使用新的。

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

但是,只有aspnet core具有开箱即用的依赖项注入功能,因此您没有能力使用强类型的配置设置并使用来自动注入它们IOptions


9
这个答案是有效的,但是它应该包含必要的代码,因此没有表决权。
Matyas

4
您所需要做的就是添加包裹:Microsoft.Extensions.Options并致电service.AddOptions();
Bruno Garcia

2
整个(很长)链接的页面似乎与ASP.NET相关,在每个示例中都提到了“ WebHost”。找到链接页面并想到“好,那是ASP.NET,控制台应用程序怎么样”后,我遇到了这个问题。
Mackenir

@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();
            }
        }
    }
}

每天生成一个文件的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"
        }
      }
    ]
  }

在网上尝试了所有这些语法后,您的语法对我有用,而且非常简单。
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

只是堆...类似于周飞宇的帖子。我在这里添加机器名称。

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文件设置为“内容/复制”: 内容

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.