【发布时间】:2012-11-06 02:55:35
【问题描述】:
我正在将游戏从单人游戏更新为多人游戏。在这种情况下,游戏最初是在大多数类都是单实例的情况下编写的。例如有一个 Player 对象、一个 GameState 对象等。也就是说,这些对象中的每一个都与应用程序一样长。
既然可以同时玩多个玩家,我显然需要支持创建多个 Player 对象、GameState 对象等。在此过程中,我开始意识到大多数对象都有三个生命周期之一:
- 应用程序的生命周期,例如处理导航的导体
- 玩家的生命周期,例如当前播放器的 SettingsViewModel
- 游戏的生命周期,例如当前游戏的 GameState
我很好奇其他人如何使用 IoC 容器来处理这些不同对象的创建。我想避免为每个具有玩家或游戏生命周期的类创建工厂类。
【问题讨论】:
-
配置生活方式/生命周期通常是大多数 DI 容器支持的。你说的是哪个平台和 DI 框架?
-
我知道一些容器在一定程度上支持生命周期管理,但是想象一个将 IPlayer 作为参数的类(就像许多类在这种情况下所做的那样)。如果只有一个容器,那么如何在不需要工厂存储运行时数据的情况下注册此类?我已经尝试为每个生命周期创建单独的容器,但是当关注点跨越生命周期时,我仍在努力连接各个部分。
-
在这种情况下 .NET/C# 但是我实际上对人们如何更普遍地解决这个设计问题很感兴趣。特别是,我不想过分依赖给定的容器,因为它可能并非在我所针对的每个平台上都可用。
-
虽然令人钦佩,但不同平台的可能性差异很大。例如,处于静态-动态范围末端的语言(例如 C++ 和 PHP)没有像 .NET 和 Java 那样丰富的类型系统。这极大地限制了 DI 容器的可能性。在当前状态下,Java 端的 DI 容器似乎完全基于基于 XML 的配置,这非常疯狂,因为大的 XML 文件会造成维护的噩梦。我认为 .NET 拥有最好的 DI 容器,这为创建可维护的软件提供了最佳机会。
-
@Steven:请更新您有关 .NET 之外的 IoC 容器的信息。首先,在 2012 年之前,Java 中有很多使用注解的 IoC 容器,而 PHP 可能比您想象的更严格。比较值时使用 === 而不是 ==。
标签: dependency-injection inversion-of-control