0

长格式,TL;DR 下面

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

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

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

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

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

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

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 的东西可以用来实现存储库模式?如果没有,我应该如何访问数据?

4

1 回答 1

1
  1. 如果我没记错的Dictionary话,.Net 中的标准在这里会很有帮助。

    方便的链接:

    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”,例如,但我只是建议它处于“实验性”方面。到目前为止,Unity 还没有一个真正简单可靠的 MySql 解决方案。

于 2020-12-27T00:05:08.990 回答