静态视图模型/展示模型

3

如果将所有的View模型/展示模型都设为静态类,那么其他视图Presenter是否可以轻松地获取对其它View模型的引用来进行更改呢?这种做法是否不正确?

如果这种方法是错误的,你会如何实现呢?

2个回答

1

如果你想让它变成静态的,最好实现一个正确的单例模式。如果你不能使用任何依赖反转技术,你会发现很难测试所有使用你的静态模型的类。

此外,如果只有一个类,请注意并发性 - 你需要锁定几乎所有东西。这不好。

最后,你可能想考虑使用工厂模式。易于访问,但将为每个想要使用它的类创建一个新的模型对象。并发问题(大多数)解决了。


谢谢您的回复。那么我可以使用单例模式来处理这些模型,这将允许我使用 Spring Ioc / 依赖注入之类的东西吗? - David
没错,最好的方法是使用“替代实例”模式。 - Chris Arnold
你能指导我关于“替代实例”模式的正确方向吗? - David

0

静态ViewModel听起来像是一个可怕的想法(我认为静态是一般原则上的邪恶)。这意味着您不能拥有多个ViewModel实例。我可以想到许多UI示例,其中有几个相同的View类型实例,但使用静态ViewModel将无法实现。

如果要启用跨视图通信,则发布/订阅(事件)是更好的选择。

请记住,当我们谈论ViewModels / Presentaion Models时,它们通常会公开底层域对象。如果您有多个显示相同域对象部分的视图,则可以在域对象更改状态时引发事件,并且显示来自该域对象的数据的任何ViewModel都可以订阅这些事件并相应地更新其控件。


再次感谢您。您的回答对我来说非常有意义,但是您回答的后半部分似乎让我有些困难。假设我有一个客户视图(客户ID=1),该视图基于一个CustomerViewModel,该对象是从具有ID = 1的客户领域对象组装而成的。假设我然后创建另一个客户视图(客户ID=1),此视图再次基于新的CustomerViewModel实例,该实例再次从具有ID = 1的客户领域对象组装而成。这些CustomerViewModel虽然最终反映相同的客户领域对象,但已经......继续 - David
该视图由两个不同的客户领域对象实例组成。当我更改属于一个视图的CustomerViewModel,并且如果它要更新底层领域对象上的属性,这将引发一个事件来表示此操作,另一个CustomerViewModel将无法从其底层领域对象接收到事件,因为它是一个不同的实例? - David
在这种情况下(它们可能会发生),您需要某种中介来同步域事件,但基本概念仍然保持不变。 - Mark Seemann
好的,那么这个中介者会在这两个ViewModel之间进行调解吗?这是事件聚合器有用的地方吗? - David
是的,它可以在所有 ViewModel 实例之间进行调解。事件聚合器在我看来只是同一概念的另一个名称 :) - Mark Seemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接