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

Cannot add appsettings.json inside WPF project .net core 3.0

我正在使用 .net Core 3.0 创建一个 WPF 项目,但我无法将项目 appsettings.json 文件添加到我的项目,该项目将用于存储我的数据库连接字符串。

我通常会在 app.config 中完成,但现在已从 .net Core 中删除。

Everywhere 提到使用 appsettings.json 作为替换,并且必须使用 IConfiguration 的实例在 OnStartUp() 函数中手动添加和初始化它,并在使用 Dependency 之后注入以将配置 class 传递到项目中。

但我的问题是只能在 asp.net 核心项目上添加 appsettings.json 项?不是我的 WPF 解决方案。

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

步骤:

  • 添加以下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


AppSetting.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));
    }
}

参考文献:

不需要切换到 .NET Core 中的 appsettings.json 文件。如果需要,您仍然可以在面向 .NET Core 的 WPF 应用程序中使用完全相同的基于 "old" 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 包。

将 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 核心 wpf 应用程序的任何位置阅读这些内容:

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

我找到了一条捷径。

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