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