C#' MVVM 可观察代理又名 Android LiveData?
C#' MVVM Observable Proxies aka Android LiveData?
我正在开发一个 C# wpf mvvm 应用程序,其中模型数据由层次结构表示,而我的 ViewModel 必须观察其间的部分层次结构。我想提出一种设计,当模型的结构层次发生变化时,使应用程序更易于维护。
示例:
模型具有层次结构 A->B->C->D。 ViewModel 想要获得 D 和 B 的更改通知。在某个时候,另一个 ViewModel 将 A 设置为一个全新的值,并且必须通知所有其他观察 ViewModels 它们的相应 D 和 B 不再有效。
目前我的设计思路:
我通过用 GUID 等唯一标识符替换直接引用来展平模型的层次结构。当 ViewModels 想要获取 D 的实例时,它实际上必须请求 Repository 获取 D 的可观察代理。当写入 A 时,可观察代理会收到通知,因此 ViewModel 也会收到通知。 obervable 代理的生命周期绑定到使用它的 ViewModel,例如ViewModel 决定何时处理可观察代理。
在 C# MVVM 中是否已经有解决此问题的模式?我看到 Android Jetpack 引入了 LiveData,它看起来与我正在尝试做的非常相似。
TLDR:贫血域模型,引用具有唯一键和消息总线的其他实体的实体是要走的路。
在研究了这个问题之后,我提出了一些行之有效的解决方案。
根据DDD(领域驱动设计):可以通过索引引用其他聚合,但不能通过对象引用。聚合只能通过聚合根访问,并将逻辑和子实体封装在聚合根内。这是 OOP,你最终会得到易于使用的对象,随着时间的推移,这些对象会变得充满方法和字段,因为,当你输入 'this.' 时,只要看看 WPF 框架 UserControl,字段、方法和事件的手风琴就会显示出来你。有人可能会争辩说,您可以使用继承并将方法与中介一起移出,以减少 5kloc OOP 源文件,但中介只是变相的过程式编程,这让我...
贫血领域模型。实体只是没有行为(方法)的数据容器,只有简单的字段或通过键引用其他实体。在哑实体之上是 'services',它们只是 运行 在哑实体上的无状态方法集合。服务的每个写入操作都会触发某种消息传递,消息总线或其他。
贫血领域模型模式目前在游戏行业非常流行,但他们称之为 'Data oriented Design' 或 DOD。 DOD 归结为大量哑数据组件对象,其中一些方法 运行 用于实现简单的并行性和缓存一致性。在我看来,这只是带有句柄的老式过程 C 编程,它对高性能应用程序很有意义。
我正在开发一个 C# wpf mvvm 应用程序,其中模型数据由层次结构表示,而我的 ViewModel 必须观察其间的部分层次结构。我想提出一种设计,当模型的结构层次发生变化时,使应用程序更易于维护。
示例:
模型具有层次结构 A->B->C->D。 ViewModel 想要获得 D 和 B 的更改通知。在某个时候,另一个 ViewModel 将 A 设置为一个全新的值,并且必须通知所有其他观察 ViewModels 它们的相应 D 和 B 不再有效。
目前我的设计思路: 我通过用 GUID 等唯一标识符替换直接引用来展平模型的层次结构。当 ViewModels 想要获取 D 的实例时,它实际上必须请求 Repository 获取 D 的可观察代理。当写入 A 时,可观察代理会收到通知,因此 ViewModel 也会收到通知。 obervable 代理的生命周期绑定到使用它的 ViewModel,例如ViewModel 决定何时处理可观察代理。
在 C# MVVM 中是否已经有解决此问题的模式?我看到 Android Jetpack 引入了 LiveData,它看起来与我正在尝试做的非常相似。
TLDR:贫血域模型,引用具有唯一键和消息总线的其他实体的实体是要走的路。
在研究了这个问题之后,我提出了一些行之有效的解决方案。
根据DDD(领域驱动设计):可以通过索引引用其他聚合,但不能通过对象引用。聚合只能通过聚合根访问,并将逻辑和子实体封装在聚合根内。这是 OOP,你最终会得到易于使用的对象,随着时间的推移,这些对象会变得充满方法和字段,因为,当你输入 'this.' 时,只要看看 WPF 框架 UserControl,字段、方法和事件的手风琴就会显示出来你。有人可能会争辩说,您可以使用继承并将方法与中介一起移出,以减少 5kloc OOP 源文件,但中介只是变相的过程式编程,这让我...
贫血领域模型。实体只是没有行为(方法)的数据容器,只有简单的字段或通过键引用其他实体。在哑实体之上是 'services',它们只是 运行 在哑实体上的无状态方法集合。服务的每个写入操作都会触发某种消息传递,消息总线或其他。
贫血领域模型模式目前在游戏行业非常流行,但他们称之为 'Data oriented Design' 或 DOD。 DOD 归结为大量哑数据组件对象,其中一些方法 运行 用于实现简单的并行性和缓存一致性。在我看来,这只是带有句柄的老式过程 C 编程,它对高性能应用程序很有意义。