【发布时间】:2011-06-29 14:33:10
【问题描述】:
我是 MVVM 的新手,如果这个问题有众所周知的解决方案,请见谅。
我们正在构建一堆模型类,它们具有预先加载的一些核心属性,以及一些可以通过进行 Web API 调用按需延迟加载的附加属性(更新:澄清一下,它将是每个延迟加载的属性的 Web API 调用)。
与其拥有多个模型,不如在其中拥有一个具有延迟加载逻辑的模型似乎是明智的。但是,似乎延迟加载的属性在访问时不应该阻塞,这样当 View 绑定到 ViewModel 并绑定到 Model 时,我们不会阻塞 UI 线程。
因此,我正在考虑一种模式,类似于当访问模型上的惰性属性时,它开始异步获取,然后立即返回默认值(例如 null)。当异步获取完成时,它会引发PropertyChanged 事件,以便 ViewModel/View 可以重新绑定到获取的值。
我已经尝试过了,它似乎工作得很好,但我想知道:
- 这种方法是否有任何我尚未发现但会随着应用程序复杂性增加而遇到的陷阱?
- 是否有针对此问题的现有解决方案,要么内置在框架中,要么被广泛用作 3rd 方框架的一部分?
【问题讨论】:
-
我能想到的可能问题是,您需要在所有这些惰性加载器上侦听 PropertyChanged 事件,这意味着如果您有一个依赖于多个这些加载器的属性或函数,在执行自己的代码之前,它必须等待它所依赖的所有加载器完成。这可能导致必须编写大量逻辑,否则这些逻辑本来可以编写为单线程调用,该调用结合了在该单独线程中“同步”获取惰性加载程序。
-
@Timothy - 好点子。我已经考虑过这一点,我的感觉是,由于延迟加载数据的性质,任何事情都不太可能依赖于多个延迟数据。多件事情可能会依赖于单个惰性数据,但我认为这不会造成问题。
-
我使用你上面描述的方法,效果很好。
标签: wpf silverlight mvvm lazy-loading inotifypropertychanged