【问题标题】:ASPNETCORE_ENVIRONMENT equivalent for .NET Core WPF app?ASPNETCORE_ENVIRONMENT 等同于 .NET Core WPF 应用程序?
【发布时间】:2023-01-24 22:08:36
【问题描述】:

我正在开发一个 .NET Core (.NET 6) WPF 应用程序,我在检测开发环境(开发或生产)时遇到问题。

当我的 WPF 应用程序启动时,我正在创建一个 IHost,以便使用依赖注入和所有其他 .NET Core 好东西,如下所示:

public partial class App : Application
{
    private readonly IHost host;

    public App()
    {
        host = Host.CreateDefaultBuilder()
            .UseContentRoot(CoreConstants.MaintenanceToolBinFolder)
            .ConfigureServices((context, services) =>
            {
                var configuration = context.Configuration;
                //...
            })
            .Build();
    }
}

现在,在 ASP.net Core 网络应用程序中,这将自动读取 ASPNETCORE_ENVIRONMENT 环境变量并使用它来确定当前环境。然而,这里完全忽略了这一点,环境始终是“Production”。

在这种情况下检测环境的正确方法是什么?我应该手动读取变量并设置环境,还是有更“正确”的方法?

【问题讨论】:

  • 在开发过程中,您是否总是在 visual studio 中以调试模式运行。
  • 在桌面应用程序中执行此操作的通常方法是提供不同的配置,这在上面的链接中有所介绍。我怀疑它是否已更改,但桌面构建工具中未包含您在 asp.net 中获得的配置覆盖。您还可以检测是否附加了调试器并将其视为开发。

标签: c# wpf .net-core .net-6.0


【解决方案1】:

由于您使用的是通用主机 (Host.CreateDefaultBuilder()),因此您应该能够使用 DOTNET_ENVIRONMENT 变量。来自docs

  • 从以下位置加载主机配置:
    • DOTNET_ 为前缀的环境变量。

【讨论】:

    【解决方案2】:

    我刚刚完成了我的第一个“类 ASP”WPF 应用程序,它运行起来非常棒。

    这是我的代码,附加了依赖注入和 Serilog 记录器配置:

    public partial class App : Application
    {
        private IHost? _host;
    
        protected override void OnStartup(StartupEventArgs e)
        {
            Startup? startup = null;
            this._host = Host.CreateDefaultBuilder(e.Args)
                .ConfigureHostConfiguration(config =>
                {
                    config.AddEnvironmentVariables(prefix: "APP_");
                })
                .ConfigureAppConfiguration((hostingContext, configBuilder) =>
                {
                    configBuilder.Sources.Clear();
    
                    IHostEnvironment env = hostingContext.HostingEnvironment;
    
                    configBuilder
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
                        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false)
                        ;
    
                    if (env.IsDevelopment())
                    {
                        configBuilder.AddUserSecrets(Assembly.GetExecutingAssembly());
                    }
    
                    IConfiguration configuration = configBuilder.Build();
    
                    Log.Logger = new LoggerConfiguration()
                        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                        .Enrich.FromLogContext()
                        .ReadFrom.Configuration(configuration)
                        .CreateLogger();
    
                    Log.Information("*** Starting application ***");
                })
                .ConfigureServices((_, services) =>
                {
                    services.AddSingleton< ... >();
                        ...
                })
                .UseSerilog()
                .Build()
                ;
    
            IServiceProvider sp = this._host.Services;
    
            var window = sp.GetRequiredService<MainWindow>();
            window.Show();
        }
    
        protected override void OnExit(ExitEventArgs e)
        {
            base.OnExit(e);
            this._host?.Dispose();
        }
    }
    

    还请记住在“项目属性”窗口或直接在 launchSettings.json 文件中配置启动设置:

    {
      "profiles": {
        "<app name>": {
          "commandName": "Project",
          "environmentVariables": {
            "APP_ENVIRONMENT": "Development"
          }
        }
      }
    }
    

    注意:我使用的是 .NET 7。

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 2020-11-07
      • 2017-01-22
      • 2020-04-09
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      相关资源
      最近更新 更多