【问题标题】:Practical management of user config data in an MVVM application [closed]MVVM应用程序中用户配置数据的实际管理[关闭]
【发布时间】:2018-11-30 23:08:02
【问题描述】:

我正在开发一个桌面应用程序,作为我们客户的 IDE。此应用程序允许用户配置我们的可编程设备并将其集成到他们的产品中。

我正在寻找在这样的 MVVM 应用程序中管理持久数据的最佳实践/设计模式。有些数据可能在用户的项目之间重复使用,所以我想独立存储这些数据,而不是存储在一个大文件中。这种情况让我考虑 Visual Studio 处理这种情况的方式(一个指向构成项目的文件的 .csproj 文件)。

在考虑 Visual Studio 方法时,我可以轻松地为自己的数据实现这样的对象并将其序列化为 XML。然而,当谈到打开和操作这个项目文件指向的文件时,我真的很难找到一个优雅的解决方案。

例如,我打开我的项目文件,对其进行反序列化,然后我得到一个包含路径的对象,以及一些元数据,如 CompanyName、ProductName 等。下一步:打开/反序列化项目文件中指向的每个文件......但是这些对象应该放在哪里?您应该如何通知 ViewModels 模型已在外部更改?直觉告诉我,任何独特模型都应该只有一个实例,以避免副本不同步的问题,但这就是我所拥有的。

也许有一个可用的框架?

这可能有一篇很好的文章或 SO 答案,但我不知道如何搜索它。任何建议将不胜感激。

【问题讨论】:

  • 至于“你应该如何通知 ViewModels 模型被外部更改了?”,答案是INotifyPropertyChanged
  • @BradleyUffner,为此,我的模型需要成为某个类的属性,并且该类必须实现 INotifyPropertyChanged(听起来像 ViewModel)。我的问题是,我的模型属于哪个类?提醒:我有 多个 ViewModel 绑定到给定模型,所以我看不出你的回答如何解决我的问题。

标签: c# mvvm config desktop-application


【解决方案1】:

应使用 Visual Studio 和 .Net 中内置的常规设置(项目属性上的设置选项卡)存储特定于应用程序的设置。这将为您提供版本控制、升级等。

特定于每个项目的设置需要存储在项目本身中。

要成为一个优秀的企业公民,您应该从用户的 Documents 目录中创建一个文件夹,然后如果每个项目有多个工件,则它可能有自己的子文件夹,或者如果项目的所有内容都在,我猜只是一个平面目录一个文件。

您问题的另一部分不清楚。您是在谈论如何在 VS 外部编辑 .cs 文件并且 VS 会自动重新加载它?如果是这样,您只需在打开项目时设置文件更改通知监视即可。

编辑:

视图模型通常不应相互引用,除非您指的是 POCO 将 INPC 实现为“视图模型”,而我并不真正这样做。对我来说,视图模型基本上是 XAML 视图的数据上下文。

就虚拟机之间的通信而言,最好保持松散耦合并使用信使模式。大多数 MVVM 框架都有信使实现。你 DI 一个 IMessenger 或他们在你的 VM 中使用的任何接口,然后 IMessenger.Subscribe<OpenMessage>() (语法显然因 MVVM 框架而异,但通常你会收到 X 类型的消息并添加事件处理程序或调用 send 方法)例如并获取该类型的通知。发起消息的 VM 会新建一个 OpenMessage 并将其发送给信使以将其分发给需要它的 VM。

对于您的 CsProj 场景,您需要将这些设置存储在项目文件中并反序列化。

【讨论】:

  • 对不起,这不是我的问题。我的意思是,当我打开一个现有文件,然后对其进行反序列化并将其分配给模型时,我应该如何通知所有引用该模型的 ViewModel?在我之前开发的所有应用程序中,它们都比较简单,所有对模型的访问都是通过 ViewModel 完成的。在这里,我有多个 ViewModel 访问一个模型。
  • 另外,我的问题与应用程序设置无关。考虑一下 Visual Studio 的类比:我希望我的用户能够创建自己的项目(如 .csproj 文件),将各种类型的新项目添加到他们的项目中(如 C# 项目中的 .cs 文件),以及重用多个项目之间的那些项目(例如添加现有的 .cs 源文件作为 C# 项目的链接)。
  • @automagically - 查看我更新的答案。这样就清楚了吗?
  • 感谢您的更新。在研究此问题时,我已经阅读了有关 Messenger 模式(以及事件总线)的信息,但我不确定它对于我的用例是否必要/可取。我得到的印象是该模式使您的应用程序难以遵循和调试。你以前应用过这个模式吗?如果可以,是否可行?
  • @automagically 我一直在使用它。我喜欢它,如果你相信的话:)。这是使 WPF / MVVM “光滑” imo 的一部分。它使一切都解耦。调试/遵循并不难。一个视图发送一条消息,关心它的视图订阅该消息。调试只不过是在事件处理程序上放置一个断点。如果您改变视图,解耦效果很好。
猜你喜欢
  • 2020-08-25
  • 2020-06-10
  • 2011-03-24
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多