【问题标题】:Accessing appsettings.json values in different project in WPF .NET Core app在 WPF .NET Core 应用程序的不同项目中访问 appsettings.json 值
【发布时间】:2019-10-11 09:57:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# wpf mvvm dependency-injection .net-core


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      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);
          }
      }
      

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

      【讨论】:

      • 这行得通,虽然项目拆分感觉有点奇怪。如果模型项目包含数据访问(例如来自数据库),您将在 appsettings 中定义连接字符串并在启动时实例化上下文/存储库,因此无论如何您都需要在视图项目中引用该项目(或者您可以使用 Autofac 等进行一些模块发现。)虽然,我不太确定我是否会使用 appsettings 来定义要排除的发票编号。发票必须来自某个数据源 - 数据源可以没有排除项吗?
      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2021-05-29
      • 2020-09-14
      相关资源
      最近更新 更多