无法在WPF项目.net core 3.0中添加appsettings.json

问题描述 投票:0回答:5

我正在使用 .net Core 3.0 创建一个 WPF 项目,但在将项目

appsettings.json
文件添加到我的项目(用于存储我的数据库连接字符串)时遇到问题。

我通常会在

app.config
内完成,但现在已从 .net Core 中删除。

Everywhere 提到使用

appsettings.json
作为替代品,并且必须使用
OnStartUp()
的实例在
IConfiguration
函数中手动添加和初始化它,然后使用依赖注入将配置类传递到项目中.

但是我的问题是只能在asp.net Core项目上添加

appsettings.json
项?不是我的 WPF 解决方案。

如果我遗漏了一些非常明显的东西(我可能就是这样),我深表歉意,我似乎找不到任何解决方案。

c# .net wpf .net-core-3.0
5个回答
67
投票

步骤:

  • 添加以下nuget包

      Microsoft.Extensions.Configuration
      Microsoft.Extensions.Configuration.FileExtensions
      Microsoft.Extensions.Configuration.Json
      Microsoft.Extensions.DependencyInjection
    
  • 您需要手动创建并添加 appsettings.json 并将

    copy it to output directory
    设置为
    copy if newer


应用程序设置.json

   {
  "ConnectionStrings": {
    "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  },
}

Program.cs(对于.NetCore控制台应用程序)

static void Main(string[] args)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

    IConfigurationRoot configuration = builder.Build();

    Console.WriteLine(configuration.GetConnectionString("BloggingDatabase"));
}

App.xaml.cs(对于.NET CORE WPF)

public partial class App : Application
{
    public IServiceProvider ServiceProvider { get; private set; }
 
    public IConfiguration Configuration { get; private set; }
 
    protected override void OnStartup(StartupEventArgs e)
    {
        var builder = new ConfigurationBuilder()
         .SetBasePath(Directory.GetCurrentDirectory())
         .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
 
        Configuration = builder.Build();

      Console.WriteLine(Configuration.GetConnectionString("BloggingDatabase"));    

        var serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);
 
        ServiceProvider = serviceCollection.BuildServiceProvider();
 
        var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
        mainWindow.Show();
    }
 
    private void ConfigureServices(IServiceCollection services)
    {
        // ...
 
        services.AddTransient(typeof(MainWindow));
    }
}

参考资料:


16
投票

无需切换到 .NET Core 中的

appsettings.json
文件。如果您愿意,您仍然可以在面向 .NET Core 的 WPF 应用程序中使用相同的基于 XML 的“旧”
App.config
文件。

只需将一个新的配置文件(项目->添加新项->应用程序配置文件)添加到您的项目中,并将其命名为“App.config”。如果您随后添加以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <connectionStrings>
    <add name="connectionString" connectionString="..."/>
  </connectionStrings>
</configuration>

...您应该能够使用

ConfigurationManager
API 在运行时获取连接字符串:

ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;

默认的 WPF 模板应默认包含 System.Configuration.ConfigurationManager 包。


4
投票

将 App.config 文件添加到项目的根目录并添加以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <connectionStrings>
    <add name="AppConnectionString" connectionString="YourCS"/>
  </connectionStrings>

  <appSettings>
    <add key="DefaultLanguage" value="1"/>
  </appSettings>

</configuration>

appSettings 带有 S 而不是 s

现在您可以在 dotnet core wpf 应用程序的任何位置阅读这些内容:

string DefaultLanguage = ConfigurationManager.AppSettings.Get("DefaultLanguage"); 
string ConnectionString = ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;

2
投票

我找到了一条捷径。

  1. 安装包 Microsoft.Extensions.Configuration.Json

  2. 在解决方案中创建AppSetting.json

    {
        "ConnectionStrings": 
        {
            "MyDataBase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
        }
    }
    
  3. 创建方法GetConnectionString

    public string GetConnectionString(string connectionStringName)
    {
        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json",
                                         optional: false,
                                         reloadOnChange: true);
    
        var configurationRoot = builder.Build();
    
        var connectionString = configurationRoot.GetConnectionString(connectionStringName);
        return connectionString;
    }
    
  4. 在OnConfiguring中调用方法GetConnectionString

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        var connectionString = GetConnectionString("MyDataBase");
        optionsBuilder.UseLazyLoadingProxies().UseSqlServer(connectionString);
    }
    

0
投票

您可以在 .net core WPF 应用程序中使用通常可从

IConfiguration
获得的任何内容。此示例来自 .net 8,具有标准 Microsoft 模板,但也适用于旧版本。

其他答案缺少的一件事是能够在

appsettings.Development.json
文件中包含本地值,覆盖
appsettings.Development.json

中的值

首先您必须设置启动设置。

转到项目属性 => 调试 => 常规 => 打开调试启动配置文件 UI。添加此环境变量:

DOTNET_ENVIRONMENT
,值为
Development

Development 值仅用于本地调试。如果发布,您将使用计算机上的 DOTNET_ENVIRONMENT 值,或者默认的 Production。测试一下。

您将在 Properties 文件夹下看到一个新的

launchSettings.json
文件。

{
  "profiles": {
    "WpfApp1": {
      "commandName": "Project",
      "environmentVariables": {
        "DOTNET_ENVIRONMENT": "Development"
      }
    }
  }
}

然后设置主机构建器。我还注册了依赖注入,以便轻松使用应用程序设置中的选项,但这不是必需的。

App.xaml.cs

public partial class App : Application
{
    public static IHost? Host { get; private set; }

    public App()
    {
        Host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder()
            .ConfigureServices(ConfigureServices)
            .Build();
    }

    private void ConfigureServices(HostBuilderContext context, IServiceCollection services)
    {
        // Add for strongly typed options injected as IOptions<ExampleType>
        services.AddOptions();
        services.Configure<ExampleType>(context.Configuration);

        // Or access the value directly here without injecting it.
        ExampleType? appSettings = context.Configuration.Get<ExampleType>();

        // Add Services
        services.AddSingleton<IDataService, DataService>();
        services.AddSingleton<MainWindow>();
    }

    protected override async void OnStartup(StartupEventArgs e)
    {
        await Host!.StartAsync();

        var mainWindow = Host.Services.GetRequiredService<MainWindow>();
        mainWindow.Show();

        base.OnStartup(e);
    }

    protected override async void OnExit(ExitEventArgs e)
    {
        await Host!.StopAsync();
        base.OnExit(e);
    }
}

只需添加 appsettings.json 和 appsettings.Development.json 文件,您将拥有与 .net core Web 应用程序相同的功能。

© www.soinside.com 2019 - 2024. All rights reserved.