【问题标题】:Where to keep an object instance that I want to share across multiple ViewModels在哪里保存我想跨多个 ViewModel 共享的对象实例
【发布时间】:2013-03-15 00:00:55
【问题描述】:

我正在使用 MVVM 在 C# 和 xaml 中构建游戏。该游戏包含一个带有新游戏选项的主菜单。新的游戏按钮会将您带到玩家选择页面,您可以在其中键入两名玩家的姓名并选择是玩家对玩家游戏还是玩家对电脑游戏。然后您到达游戏屏幕并开始游戏。

我的问题是,我将持久信息保存在 Game 对象中,该对象包含 Player Player1Player Player 2ReactiveCollection<Tile> Tiles 等属性。我是否应该将 Game 实例设为静态并完成还是有更好的方法来做到这一点?

【问题讨论】:

  • static 不可测试。你的代码最好分成模块,游戏容器可以解析哪些对象需要哪些模块。
  • @Romoku 我不想让它静态,但我现在想不出更好的方法。你有什么想法吗?
  • 看看Dependency Injection By Hand。这应该会给你一个很好的开始,让你了解如何处理制作模块。
  • 是的,我认为您不想将游戏引擎保留在 UI 层 (MVVM) 中。相反,您可能希望您的模型查询游戏引擎(Player、Tiles 等)的当前状态并将其显示给用户。分离 UI 和游戏状态持久性之间的关注点。
  • 阅读这个 - 它是关于单例而不是简单的静态变量,但要点是一样的:gameprogrammingpatterns.com/…

标签: c# wpf mvvm architecture


【解决方案1】:

我会使用游戏服务。

public interface IGameService
{
    Player PlayerOne { get; set; }
    Player PlayerTwo { get; set; }
    Tiles ReactiveCollection { get; set; }
}

然后在创建视图模型/应用程序时,可以使用 IOC / 依赖注入将您的服务解析为一个类。这样,您可以创建一个可供任何视图模型使用的服务类的单例,但它是解耦和可测试的。然后,实现您的 IGameService 的类可以获取来自游戏的信息/数据,但是它想要这也使其灵活。您可以更改信息传递方式,而无需更改使用该服务的视图模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多