如何读取应用设置.在WPF Prism应用程序中



在纯WPF应用程序中,我可以使用HostBuilder,如下所示。但我怎么能在Prism应用程序中做到同样的事情呢?据我所知,HostBuild在Prism中是不可能的(根据Brian Lagunas的说法,它没有意义-找不到链接)。

谁能给我指出正确的方向或分享一个代码?

public App()
{
_host = new HostBuilder()
.ConfigureAppConfiguration((context, configurationBuilder) =>
{
configurationBuilder.SetBasePath(context.HostingEnvironment.ContentRootPath);
configurationBuilder.AddJsonFile("appsettings.json", optional: false);
})
.ConfigureServices((context, services) =>
{
services.Configure<AppSettings>(context.Configuration);
services.AddDbContext<VisitorDbContext>(options =>
options.UseSqlServer(context.Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<ISampleService, SampleService>();
services.AddScoped<IImportService, ImportService>();
services.AddSingleton<MainWindow>();
})
.ConfigureLogging(logging =>
{
//logging.AddConsole();
})
.Build();
}

如果你使用。net主机来解析应用程序设置,你可以覆盖你的PrismApp.xaml.cs类的RegisterTypes方法来注册IOptions<T>应用程序:

public partial class App : PrismApplication
{
private readonly IHost _host;
public App()
{
_host = ...;
}
...
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance(
_host.Services.GetService<IOptions<AppSettings>>());
}
}

在不使用主机的情况下,可以像下面这样做

public sealed partial class App
{
private readonly AppSettings? _appSettings;
public App()
{
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("appsettings.json", optional: false);
IConfigurationRoot configuration = configurationBuilder.Build();
IServiceCollection services = new ServiceCollection();
services.Configure<AppSettings>(configuration.GetSection(typeof(AppSettings).Name));
IServiceProvider provider = services.BuildServiceProvider();
IOptions<AppSettings>? options = provider.GetService<IOptions<AppSettings>>();
if (options is null)
throw new ApplicationException("App settings is not registered");
_appSettings = options.Value;
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance(_appSettings);
}
}

您需要添加以下包

<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />

和以下命名空间

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

最新更新