我是.NET Core的新手,目前正在使用WPF .NET Core应用程序。我用三个不同的项目构建了解决方案:View
,ViewModel
和Model
。
我的Model
包含业务逻辑,在其中我从不同的来源获取发票数据。现在,我需要排除具有某些发票编号的发票。我决定在appsettings.json文件中定义这些数字。经过一些研究,我了解到必须在OnStartup()
项目的App.xaml.cs
文件中的View
方法内初始化IConfigurationBuilder实例。我read配置类应该在目标项目(在我的情况下为Model
项目)中定义,并在OnStartup()
项目的View
方法中使用,因此依赖注入可用于传递目标项目的配置类,如this link中所述。
但是,要使此方法起作用,我必须在我的Model
项目中向我的View
项目添加一个依赖项,以便可以在此处访问config类。我相信这会违反MVVM模式-至少我是怎么理解的。
您将如何解决这个问题?这里的最佳做法是什么?还是我做的事情完全错误?我也欢迎使用完全不同的方法的建议。
您必须在Model
项目中为View
项目添加一个依赖项,因为它也用作项目的组合根(包含OnStartup()
方法)。对Model
的依赖是合理的。
只要您没有在Views中没有直接使用Model执行操作的代码(跳过View Models,就不会破坏MVVM)。视图可以知道模型(反之亦然),并且在某些情况下可以派上用场(例如,通过Model
通过xaml样式触发器从{x:Static model:MyEnum.MyValue}
项目中引用一些枚举)
我决定只将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);
}
}
虽然不确定这是否是正确的方法。