【问题标题】:Is there something akin to an ORM for Unity to use Repository Pattern w/ Zenject?Unity 是否有类似于 ORM 的东西来使用带有 Zenject 的存储库模式?
【发布时间】:2021-04-03 18:28:44
【问题描述】:

长篇,TL;DR 下面

我目前正在使用 Zenject 开发一款游戏,并设计了与 Web 应用程序非常相似的 UI 和游戏架构,其中有 IConversationRepository-接口提供对 Conversations 等数据的访问,并使用 GetConversationById(...) 等方法。

到目前为止,接口是由返回硬编码数据的假人实现的,但是当我进一步进行时,必须改变。

如果这是一个 Web 应用程序,我将只使用 ORM 并让它处理对象的查询和加载,所以我的问题是 Unity / Zenject 是否也存在这种情况,如果不存在,正确的实现方法是什么使用 Zenject 时的数据访问。

更新(回应与@Fattie 的有益讨论)

我基本上感兴趣的是一种通用的方式来加载具有对其他对象的引用的对象,并能够查询它们。

举个例子,假设一个Conversation 对象包含许多ConversationItems,每个Person 类型的Speaker 字段。然后我希望能够执行这样的操作:

var someSpeaker = personRepository.getById(100);
var conversation = conversationRepository.getById(0);

if (conversation.items[0].speaker == someSpeaker) {
    // I know, in this example this behaviour could be moved
    // into a method of Person to avoid the check for identity
    // but I hope the idea is understandable.
}

这里重要的是,如果多个SpeechItems 的说话者相同,则每个引用的对象也应该相同,这使得简单地反序列化 JSON 是不可行的。

TL;DR 有没有类似 ORM 的东西可以用来实现 Repository 模式?如果没有,我应该如何访问数据?

【问题讨论】:

  • 我有个坏消息,不幸的是,“Zenject”对于像 Unity 这样的 ECS 系统绝对完全没用。诸如游戏引擎之类的 ECS 系统根本就不是 OO 编程系统。 (您通常使用 OO 语言,在本例中为 C#,来编写可以附加到游戏对象的组件,但这与 ECS“场景”的架构和结构无关。)
  • @Fattie 感谢您的回答,这在许多情况下可能都是正确的,但这实际上取决于用例。您将如何实现在 ECS 中存储和加载对话或任务? Zenject 也被 Pokemon GO 和 Beat Saber 等成功的游戏使用。 (github.com/svermeulen/Extenject/blob/master/Documentation/…)
  • 这非常简单。 (就像统一中的大多数东西一样。)单例的概念在统一场景中是没有意义的,所以你的预加载场景中只有一个游戏管理器对象。仅此而已。 stackoverflow.com/a/35891919/294884 就是一行代码
  • 请注意,在您的“管理脚本”(我们称之为 Conversations.cs)上,它将附加到预加载场景中的 DDOL 游戏对象,您绝对可以使用任何您喜欢的数据技术 - MySql 是可能的(但有点笨拙,记住 Unity 几乎可以在任何平台上运行!)我非常怀疑 sql 数据库是否相关 - 只需使用 .Net sata 结构就可以了。如果需要,本地存储到 Json。请注意这个问题,有人(简单)想知道“如何保存 100,000 个字符串”
  • 这种预加载场景行为可以通过 Zenject 的 Project Context 实现(它在内部通过 DDOL 对象使这些对象在场景更改中幸存下来)。我可能使用了糟糕的措辞,因为我正在寻找的是一种适当/通用的方法来处理您提到的对象检索,只需使用 .Net 数据结构或使用 Json。我需要一些东西,例如缝合交叉崇敬,例如如果对话谈话项目引用演讲者。我会尝试更新问题以更好地反映这一点。

标签: unity3d orm repository-pattern zenject


【解决方案1】:
  1. 如果我没记错的话,.Net 中的标准 Dictionary 在这里会很有帮助。

    方便的链接:

    https://programmingwithmosh.com/net/csharp-collections/

  2. 请注意,在 Unity 中很少需要关系数据库方法,日常的 .Net 数据结构对于 100,000 个可搜索的文本项来说就足够了。您可以在 Unity 中拼凑 MySql,但问题是每个平台单独处理它。

  3. 关于 Unity 本身。只需使用“游戏管理器”类型GameObject(即简单地标记为 DDOL)和您的类(可能是“ConversationsProvider”或任何名称)。单例本身在 Unity 中毫无意义,您很可能需要使用 MonoBehavior 的一般功能,因此您只需将其设为“游戏管理器”样式组件即可。 “ConversationsProvider”可以根据需要简单或复杂;它可能有许多子系统(与服务器的实时连接,生成系统,谁知道)。但从项目的其他部分来看,它只是一个您可以访问的完全简单的 MonoBehavior - 它完全是微不足道的。

这是您在 Unity 中执行此操作的“直接”方式。如果 OP 正在试验 Zenject,也许也可以尝试“通常”的方法!

为了更准确地回答 OP 的问题,是的,我会说一些针对 Unity 的实验性 ORM/MySql 解决方案。可以轻松地在 Google 上搜索一些“用于 Unity 的 ORM”example,但我只是建议它处于“实验性”方面。到目前为止,还没有一个真正简单的、可靠的 Unity MySql 解决方案。

【讨论】:

  • 我会再等一会儿,看看有没有人知道一个成熟的解决方案,并且可以很好地处理对象之间的关系。如果没有,我会接受这个答案(并且必须决定如何继续:D)
  • 当然,最好等待更多答案!!
  • 我花了几天时间评估 Extenject / Zenject,并在我的 WIP 游戏中部分实现了它,但以后不会使用它。我的理由是,虽然我是一名专业程序员,但我对 Unity3D 的了解还不够,无法知道如何最好地将它与 DI 工具结合起来。
  • 长话短说,“Zenject”完全没用。我很欣赏他们的广告声明它们被用于一些知名游戏;魔鬼在细节中,谁知道它是如何使用的;当然,在某些非常具体的情况下它可能会派上用场。
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 2011-01-21
  • 2011-12-04
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多