MVVM 应用程序中用户配置数据的实用管理
Practical management of user config data in an MVVM application
我正在开发一个桌面应用程序作为我们客户的IDE。此应用程序允许用户配置我们的可编程设备并将其集成到他们的产品中。
我正在寻找最好的 practices/design 模式来管理像这样的 MVVM 应用程序中的持久数据。有些数据可能在用户的项目之间重复使用,所以我想独立存储这些数据,而不是在一个大文件中。这种情况让我考虑了 Visual Studio 处理此问题的方式(指向构成项目的文件的 .csproj 文件)。
在考虑Visual Studio方法时,我可以很容易地为自己的数据实现一个这样的对象并将其序列化为XML。但是,在打开和操作这个项目文件指向的文件时,我真的很难找到一个优雅的解决方案。
例如,我打开我的项目文件,将其反序列化,剩下一个包含路径的对象,以及一些元数据,如 CompanyName、ProductName 等。下一步:open/deserialize 项目文件中指向的每个文件...但是这些对象应该放在哪里?您应该如何通知 ViewModels 模型已从外部更改?直觉告诉我,任何唯一模型都应该只有一个实例,以避免副本不同步的问题,但这就是我所拥有的。
也许有可用的框架?
可能有一篇很好的文章或 SO 答案,但我不知道如何搜索它。任何建议将不胜感激。
特定于应用程序的设置应使用内置于 Visual Studio 和 .Net(项目属性上的“设置”选项卡)中的常规设置进行存储。这将为您提供版本控制、升级等。
每个项目特定的设置需要存储在项目本身中。
要成为一个优秀的企业公民,您应该在用户的文档目录之外创建一个文件夹,然后如果每个项目有多个工件,则它可能有自己的子文件夹,或者我想如果所有关于项目是单个文件。
你问题的另一部分不清楚。您是在谈论如何在 VS 外部编辑 .cs 文件并 VS 自动重新加载它?如果是这样,您只需在打开项目时设置文件更改通知监视即可。
编辑:
视图模型通常不应相互引用,除非您指的是将 INPC 实现为 "view model" 的 POCO,但我并不这么认为。视图模型对我来说基本上是 XAML 视图的数据上下文。
就VM之间的通信而言,最好保持松散耦合并使用信使模式。大多数 MVVM 框架都有一个信使实现。例如,您将 IMessenger 或它们使用的任何接口注入到您的 VM 中,然后 IMessenger.Subscribe<OpenMessage>()
(语法显然因 MVVM 框架而异,但通常您会收到 X 类型的消息并添加事件处理程序或调用发送方法)并获得该类型的通知。发起消息的 VM 将新建一个 OpenMessage 并将其发送给 Messenger,以将其分发给需要它的 VM。
对于您的 CsProj 方案,您需要将这些设置存储在项目文件中并反序列化。
我正在开发一个桌面应用程序作为我们客户的IDE。此应用程序允许用户配置我们的可编程设备并将其集成到他们的产品中。
我正在寻找最好的 practices/design 模式来管理像这样的 MVVM 应用程序中的持久数据。有些数据可能在用户的项目之间重复使用,所以我想独立存储这些数据,而不是在一个大文件中。这种情况让我考虑了 Visual Studio 处理此问题的方式(指向构成项目的文件的 .csproj 文件)。
在考虑Visual Studio方法时,我可以很容易地为自己的数据实现一个这样的对象并将其序列化为XML。但是,在打开和操作这个项目文件指向的文件时,我真的很难找到一个优雅的解决方案。
例如,我打开我的项目文件,将其反序列化,剩下一个包含路径的对象,以及一些元数据,如 CompanyName、ProductName 等。下一步:open/deserialize 项目文件中指向的每个文件...但是这些对象应该放在哪里?您应该如何通知 ViewModels 模型已从外部更改?直觉告诉我,任何唯一模型都应该只有一个实例,以避免副本不同步的问题,但这就是我所拥有的。
也许有可用的框架?
可能有一篇很好的文章或 SO 答案,但我不知道如何搜索它。任何建议将不胜感激。
特定于应用程序的设置应使用内置于 Visual Studio 和 .Net(项目属性上的“设置”选项卡)中的常规设置进行存储。这将为您提供版本控制、升级等。
每个项目特定的设置需要存储在项目本身中。
要成为一个优秀的企业公民,您应该在用户的文档目录之外创建一个文件夹,然后如果每个项目有多个工件,则它可能有自己的子文件夹,或者我想如果所有关于项目是单个文件。
你问题的另一部分不清楚。您是在谈论如何在 VS 外部编辑 .cs 文件并 VS 自动重新加载它?如果是这样,您只需在打开项目时设置文件更改通知监视即可。
编辑:
视图模型通常不应相互引用,除非您指的是将 INPC 实现为 "view model" 的 POCO,但我并不这么认为。视图模型对我来说基本上是 XAML 视图的数据上下文。
就VM之间的通信而言,最好保持松散耦合并使用信使模式。大多数 MVVM 框架都有一个信使实现。例如,您将 IMessenger 或它们使用的任何接口注入到您的 VM 中,然后 IMessenger.Subscribe<OpenMessage>()
(语法显然因 MVVM 框架而异,但通常您会收到 X 类型的消息并添加事件处理程序或调用发送方法)并获得该类型的通知。发起消息的 VM 将新建一个 OpenMessage 并将其发送给 Messenger,以将其分发给需要它的 VM。
对于您的 CsProj 方案,您需要将这些设置存储在项目文件中并反序列化。