如何避免将依赖项注入对象以便它可以传递它们?

Pet*_*rne 5 architecture model-view-controller design-patterns dependency-injection

我感兴趣的是将依赖注入应用于我当前的项目,该项目使用了MVC模式.

我的控制器将调用模型,因此需要将依赖项注入模型中.为此,控制器必须首先具有依赖项(例如数据库对象).控制器不需要使用其中的一些依赖项(例如数据库对象),所以我觉得不应该给它这种依赖.但是,如果要将它们注入模型对象,则必须具有这些依赖关系.

如何避免将依赖项注入到对象中以便它可以传递它们?这样做会感觉不对,并且可能导致许多依赖项被注入到对象中.

编辑:我正在使用PHP.

Mar*_*ann 2

我同意你的担忧。获取依赖项的唯一目的是将它们传递给其他依赖项,这是一种代码味道。

根据这些依赖项之间的确切交互,您有几个选项:

如果只需要一个依赖项实例

如果您的控制器只需要依赖项的单个实例,那么只需对其进行依赖即可。

(对 C# 代码表示歉意)

要这样做:

public class MyController
{
    public MyController(IDb db)
    {
        var dep = new MyDependency(db);
        // Use dep or save it for later
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,您可以这样做:

public class MyController
{
    public MyController(MyDependency dep)
    {
        // Use dep or save it for later
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑MyDependency接口本身的背后。另请参阅重构聚合服务

如果您需要在控制器的生命周期内创建多个实例

然而,有时您需要动态创建多个实例。当您需要一个仅在运行时可用的值才能完全填充依赖项时,通常会出现这种情况。

在这种情况下,抽象工厂是一个优秀且通用的解决方案

  • 控制器不必向 DAL 提供数据库对象,因为控制器不会“新建”DAL。控制器向 IoC 容器(或您创建的用于执行相同功能的对象)请求 DAL,IoC 容器负责向 DAL 提供数据库对象。 (2认同)