簡體   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