我正在使用 .net Core 3.0 创建一个 WPF 项目,但在将项目
appsettings.json
文件添加到我的项目(用于存储我的数据库连接字符串)时遇到问题。
我通常会在
app.config
内完成,但现在已从 .net Core 中删除。
Everywhere 提到使用
appsettings.json
作为替代品,并且必须使用 OnStartUp()
的实例在 IConfiguration
函数中手动添加和初始化它,然后使用依赖注入将配置类传递到项目中.
但是我的问题是只能在asp.net Core项目上添加
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
应用程序设置.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 应用程序中使用相同的基于 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 core wpf 应用程序的任何位置阅读这些内容:
string DefaultLanguage = ConfigurationManager.AppSettings.Get("DefaultLanguage");
string ConnectionString = ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
我找到了一条捷径。
安装包 Microsoft.Extensions.Configuration.Json
在解决方案中创建AppSetting.json
{
"ConnectionStrings":
{
"MyDataBase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
}
}
创建方法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;
}
在OnConfiguring中调用方法GetConnectionString
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
var connectionString = GetConnectionString("MyDataBase");
optionsBuilder.UseLazyLoadingProxies().UseSqlServer(connectionString);
}
您可以在 .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 应用程序相同的功能。