[英]Accessing appsettings.json values in different project in WPF .NET Core app
我是 .NET 核心的新手,目前正在使用 WPF .NET 核心應用程序。 我用三個不同的項目構建了我的解決方案: View
、 ViewModel
和Model
。
我的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.