繁体   English   中英

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

[英]Accessing appsettings.json values in different project in WPF .NET Core app

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

我的Model包含业务逻辑,并在其中从不同来源获取发票数据。 现在我需要排除具有某些发票编号的发票。 我决定在 appsettings.json 文件中定义这些数字。 经过一番研究,我了解到我必须在View项目的App.xaml.cs文件中的OnStartup()方法中初始化 IConfigurationBuilder 实例。 读到配置类应该在目标项目中定义(在我的例子中是Model项目)并在View项目的OnStartup()方法中使用,因此可以使用依赖注入将配置 class 传递给目标项目,就像这个链接中描述的那样。

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

你将如何解决这个问题? 这里有哪些最佳实践? 还是我做的事情完全错了? 我也愿意建议使用完全不同的方法。

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

只要视图中没有直接使用 Model 执行操作的代码,跳过视图模型,就不会破坏 MVVM。 Views can be aware of Models (not vice versa), and it can be handy in some situations (eg reference some enum from Model project in xaml style trigger via {x:Static model:MyEnum.MyValue} )

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

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

public partial class App : Application
{
    public IConfiguration Configuration { 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);

        IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM