在WPF .NET Core应用程序中的不同项目中访问appsettings.json值

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

我是.NET Core的新手,目前正在使用WPF .NET Core应用程序。我用三个不同的项目构建了解决方案:ViewViewModelModel

我的Model包含业务逻辑,在其中我从不同的来源获取发票数据。现在,我需要排除具有某些发票编号的发票。我决定在appsettings.json文件中定义这些数字。经过一些研究,我了解到必须在OnStartup()项目的App.xaml.cs文件中的View方法内初始化IConfigurationBuilder实例。我read配置类应该在目标项目(在我的情况下为Model项目)中定义,并在OnStartup()项目的View方法中使用,因此依赖注入可用于传递目标项目的配置类,如this link中所述。

但是,要使此方法起作用,我必须在我的Model项目中向我的View项目添加一个依赖项,以便可以在此处访问config类。我相信这会违反MVVM模式-至少我是怎么理解的。

您将如何解决这个问题?这里的最佳做法是什么?还是我做的事情完全错误?我也欢迎使用完全不同的方法的建议。

c# wpf mvvm dependency-injection .net-core
2个回答
1
投票

您必须在Model项目中为View项目添加一个依赖项,因为它也用作项目的组合根(包含OnStartup()方法)。对Model的依赖是合理的。

只要您没有在Views中没有直接使用Model执行操作的代码(跳过View Models,就不会破坏MVVM)。视图可以知道模型(反之亦然),并且在某些情况下可以派上用场(例如,通过Model通过xaml样式触发器从{x:Static model:MyEnum.MyValue}项目中引用一些枚举)


0
投票

我决定只将IConfiguration实例传递给Model项目,然后从那里处理事情,以便Configuration设置代码(如configurationBuilder.Configure<MySettingsClas>())不再在View项目中,而在Model项目中。这样,我不需要从模型向视图添加依赖项。

我的App类现在看起来像这样:

public partial class App : Application
{
    public IConfiguration Configuration { get; private set; }
    public IServiceProvider ServiceProvider { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        IConfigurationBuilder builder = new ConfigurationBuilder()
                                        .SetBasePath(Directory.GetCurrentDirectory())
                                        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        Configuration = builder.Build();

        ServiceCollection serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        ServiceProvider = serviceCollection.BuildServiceProvider();

        MainWindow mainWindow = new MainWindow(ServiceProvider.GetRequiredService<IConfiguration>());
        mainWindow.Show();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(Configuration);
    }
}

虽然不确定这是否是正确的方法。

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