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

时间:2010-04-07 10:36:53

标签: model-view-controller design-patterns architecture dependency-injection

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

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

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

编辑:我正在使用PHP。

2 个答案:

答案 0 :(得分:2)

我同意你的担忧。将依赖性作为代码气味的唯一目的是将它们传递给其他依赖项。

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

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

如果您的Controller只需要一个依赖项的单个实例,那么只需依赖它。

(为c#代码道歉)

不要执行此操作:

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

相反,你可以这样做:

public class MyController
{
    public MyController(MyDependency dep)
    {
        // Use dep or save it for later
    }
}

您可能需要考虑接口本身后面的MyDependency。另请参阅Refactoring to Aggregate Services

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

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

在这种情况下,Abstract Factoryexcellent and universal solution

答案 1 :(得分:1)

我不是在讲PHP经验,但你应该研究Inversion of Control (IOC) Containers

StackOverflow上的这个question讨论了IOC Containers for PHP。要快速了解一些other benefits of IOC Containers,您应该查看这个问题,这可能是我在网站上最喜欢的问题之一。检查最后一个答案;)

  

如何避免依赖   注入物体就是这样   它可以通过吗?这样做感觉   错了,可能导致很多   依赖被注入到   对象

大多数人都没有意识到IOC容器需要存储临时依赖项。这反过来又使您的代码更清晰,更容易理解。代码的每个类(或模块)只是询问它需要什么。 IOC容器可以管理对象的生命周期,因此即使两个类独立地请求相同的依赖关系,它们也可以接收相同的实例,这非常简洁。