gpt4 book ai didi

c# - 多级 DI 重构

转载 作者:行者123 更新时间:2023-11-30 22:34:26 26 4
gpt4 key购买 nike

我不知道这是否真的符合 DI,因为我不是在谈论注入(inject)抽象依赖项的具体实现。我只是在谈论注入(inject)需要时间的东西。

在我的游戏引擎中,我想清理处理游戏状态的部分(菜单、阶段选择、游戏内、过场动画等)。所有这些东西都实现了一个通用接口(interface)。但其中之一,在游戏中,也被特别引用为当前正在玩的级别。

我的项目中现在有 43 个引用到当前关卡,通过游戏访问,一个单例。例如,Game.CurrentGame.CurrentMap.Something。引用在屏幕、实体、行为组件中,甚至在主窗体中(用于调试工具)。

我想通过注入(inject)所需的一切来摆脱这个引用。但 CurrentMap 本身并不是所需的依赖项 - 其他内容正在其下方访问。所以我最初的计划是进入每个地方,找到实际使用的东西,然后通过向该类构造函数添加一个参数来注入(inject)它。这引入了另一个依赖关系,所以我重复这个过程,直到一切都完成。但这样做的问题是它会引入更多的构造函数参数,包括在不直接使用依赖项的地方。许多类最终会接受一个依赖项,这样它们就可以将它传递给它们下面的另一个对象。

什么是更清洁的替代方案?

最佳答案

您所讨论的场景中,依赖项必须向下穿过几层对象才能到达真正需要它们的位置。这不需要发生。

如果一个对象自己创建了依赖关系,你就会遇到这个问题。如果对象由工厂或 DI 容器(这只是一个奇特的工厂)提供了它所需的依赖关系,那么你就不会有这个问题。所以为了避免这个问题,你需要决定每个类是关注游戏逻辑还是创建类。

假设您有对象 a,它调用对象 b,对象 b 又调用对象 c 和对象 c需要当前级别而对象 b 不需要。

错误的方法是从 b 中调用 new C(level);。正如您所指出的,b 不需要了解级别,因此情况似乎变得更糟而不是更好。您在依赖注入(inject)方面做得还不够。不是在 b 中创建 c,而是在 b 的构造函数中请求 c。现在 b 类只知道 c 而对 level 一无所知。

Misko 比我在这里解释得更好 http://misko.hevery.com/2009/03/30/collaborator-vs-the-factory/

工厂中的代码如下所示:

Level level = new Level();
C c = new C( level );
B b = new B( c );
A a = new A( b );

类 B 只知道它的直接合作者 (c),并且不依赖于 Level。因为我们是在工厂中创建东西,所以没有必要通过对象图将对象图的叶子向下传递。

如果 B 类负责创建 c,那么它需要知道如何创建 c 类的实例。这是错误的。

关于c# - 多级 DI 重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com