所有(OOP)依赖项的根存储在哪里?

Kev*_*aja 6 .net c# oop dependency-injection unity-game-engine

我正在学习C#及其周围的最佳实践。

现在我知道了:

  1. 单一责任原则
  2. 静态类
  3. 辛格尔顿
  4. 依赖注入

每个人都说避免单例和静态,而更喜欢依赖注入。

现在,我已经转换了所有类,以便它们不必获取自己的数据,例如删除:

_myItem = Repository.Instance.FindById(1);
Run Code Online (Sandbox Code Playgroud)

而是将我的依赖项注入MyClass中。

public MyClass(Repository repository) {
    _myItem = repository.FindById(1);
}
Run Code Online (Sandbox Code Playgroud)

但是,既然MyClass遵循单一职责原则,并且从MyClass外部获取所有依赖关系,那么哪个/哪个类将负责提供所有依赖关系?

我在Unity中的示例问题是:

  • UIStatusPanelClass取决于CurrentCharacter。
  • GameInputClass取决于CurrentCharacter和CurrentCamera。
  • CharacterManagerClass保留CurrentCharacter,但不负责传递给其他类,因为它的唯一职责是将所有角色保留在场景中。
  • UIInventoryClass取决于由CurrentCharacter持有的InventoryClass。
  • StatisticClass取决于CurrentCharacter。
  • ItemRepositoryClass负责保存List,但不负责获取项目。

请帮助我理顺这些知识。

Ste*_*ven 6

既然MyClass遵循单一职责原则,并且从MyClass外部获取所有依赖关系,那么哪个/哪个类将负责提供所有依赖关系?

这是成分根的功能:

组合根是应用程序中模块组成的(最好)唯一位置。

合成根位于应用程序根目录内。

DI容器是有用但可选的工具,可以充当合成引擎。在没有DI容器的情况下应用DI的做法称为Pure DI。如果使用DI容器,则可以将其视为“ 合成根”的一部分

关于以下代码的一则警告:

public MyClass(Repository repository) {
    _myItem = repository.FindById(1);
}
Run Code Online (Sandbox Code Playgroud)

在实施DI时,注入构造函数应该没有任何逻辑,并且除了存储它们的传入依赖项外,不应该做其他任何事情。这意味着您不应FindByIdMyClass的构造函数中调用。这应该在以后的阶段中完成;在一个MyClass的方法。