【问题标题】:Is it OK to share common details between view models in a static class?在静态类中的视图模型之间共享公共细节是否可以?
【发布时间】:2013-10-28 05:41:06
【问题描述】:

我正在试验 MvvmCross 视图模型,在我的应用程序中,它们不仅在具有相似布局结构的不同平台之间共享,而且在根据应用程序的外形尺寸以不同方式呈现信息的应用程序之间共享。例如,iPad 应用程序可能会在同一页面上显示客户列表和选定的客户详细信息,而 iPhone 应用程序会将它们拆分到不同的页面中。 MvvmCross 支持所有此类场景,因此在所有这些应用程序之间共享公共视图模型集非常简单。

但是,在某些情况下,可以方便地在多个视图模型之间共享相同的详细信息。例如,不同的视图可能会显示最近的 twitter 消息、股票报价更新等。或者一些全局用户设置(用户名、最近的登录时间等)。我暂时将它们放在从 MvxNotifyPropertyChanged 继承的单例类 AppState 中。所有视图模型都有属性 AppState 来访问共享的应用程序状态,因此任何视图都可以将其控件绑定到 AppState。这也适用于设计时模型。

我已经在几个平台上进行了测试(还没有尝试非 Windows 平台),并且可以正常工作。但我没有测试生命周期场景,例如墓碑/脱水。基本上,我的视图中有一些部分绑定到单例的属性。是否有任何与视图模型生命周期相关的注意事项?

此外,如果可以接受使用此类单例,我可以使用singleton pattern 或 MvvmCross 依赖注入 (MvxResolve)。从技术上讲,它是相同的,那么这两种方法有什么优势吗?

【问题讨论】:

    标签: c# design-patterns singleton viewmodel mvvmcross


    【解决方案1】:

    如果静态共享适用于您和您的应用,那就太好了。

    我无法想到为什么这会使您的对象更难在不同的生命周期情况下使用。

    statics 被“皱眉”的主要原因是架构上的原因 - statics 导致紧密耦合的代码难以测试,并且(恕我直言)从长远来看更难以维护和重用。

    如果您的应用不关心这些事情(可能就是这种情况),那么静态单例可能是构建您的应用的好方法 - 甚至可以让其他人更容易理解代码。

    关于这类领域还有很多其他问题,例如:

    【讨论】:

    • 是的,我知道对测试的影响,但在这种情况下,我希望我的测试能够验证实际的单例值,因此我将 AppState 保持在模拟之外。我更关心某些特定移动平台上与单例生命周期相关的任何事情。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多