【发布时间】: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