我感兴趣的是将依赖注入应用于我当前的项目,该项目使用了MVC模式。
我的控制器将调用模型,因此需要将依赖项注入模型中。为此,控制器必须首先具有依赖项(例如数据库对象)。控制器不需要使用某些依赖项(例如数据库对象),所以我觉得不应该给它这种依赖。但是,如果要将它们注入到模型对象中,它必须具有这些依赖关系。
如何避免将依赖项注入到对象中以便它可以传递它们?这样做会感觉不对,并且可能导致许多依赖项被注入到对象中。
编辑:我正在使用PHP。
答案 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的生命周期内创建多个实例
但是,有时您需要动态创建多个实例。当您需要一个仅在运行时可用的值,然后才能完全填充依赖项时,通常会出现这种情况。
答案 1 :(得分:1)
我不是在讲PHP经验,但你应该研究Inversion of Control (IOC) Containers。
StackOverflow上的这个question讨论了IOC Containers for PHP。要快速了解一些other benefits of IOC Containers,您应该查看这个问题,这可能是我在网站上最喜欢的问题之一。检查最后一个答案;)
如何避免依赖 注入物体就是这样 它可以通过吗?这样做感觉 错了,可能导致很多 依赖被注入到 对象
大多数人都没有意识到IOC容器需要存储临时依赖项。这反过来又使您的代码更清晰,更容易理解。代码的每个类(或模块)只是询问它需要什么。 IOC容器可以管理对象的生命周期,因此即使两个类独立地请求相同的依赖关系,它们也可以接收相同的实例,这非常简洁。