我一直在阅读依赖注入和DI容器。 但是,我无法为这个概念着迷。
DI容器如何知道"控制器"取决于"装载机",而在"控制器"之前装载"装载机"?
我的看法是,它将需要某种配置文件来跟踪依赖关系,如果是这样,编写起来就更加容易了:
// Controller
function __construct() {
$this->load = new \Framework\Core\Loader;
}
顺便说一句,编写function __construct($loader) { $this->load = new $loader; }甚至更容易(而且很明显)。
是的,DIC需要在一些配置文件中或通过堆叠工厂闭包或通过注释源代码来进行前期配置。
是的,在ctor中创建实例更加容易,但是这将消除DI的所有好处,因为您不再需要注入依赖项。
另请注意,您不需要DIC即可进行DI。 DI只是通过构造函数,setter或using方法在代码中注入依赖项的行为。
因此,如果我想做DI,我会将Loader类注入Controller中,例如。 $controller = new Controller($loader);然后在控制器function __construct($injected) { $this->load = $injected; }中?
@用户是的。您只需注入所有依赖项,即可通过构造函数将对象置于有效状态。首先弄清楚这个概念,然后再与DIC混淆。对于大多数应用程序,您还是不需要它们。
我将如何去上课。我是否应该创建一个工厂来创建新类并插入所有需要的依赖项?
@ user1320555是的,工厂做得很好。见stackoverflow.com/questions/6094744/
@戈登我最近遇到了这个问题(也正在学习),并已经提出了某些解决方案。请亲切看看:stackoverflow.com/questions/21368535/
@IliaRostovtsev不知道您想说些什么。
@戈登好吧,我只是想知道,从您的角度来看,使用Dice是否可以。它有哪些明显的局限性(如果有)。我还没有看到过DIC可以用很少的代码来加载依赖项(可能是因为Im尚未非常有经验)。是否有众所周知的DIC,出于某些原因,您希望它比该DIC好吗?还是一切都严格取决于项目?感谢您格式化我的问题! ;)
@IliaRostovtsev我以前从未使用过Dice。我只知道Symfony DI和RG Injektor。假设您已配置了服务,那么两者都将使您以相同的简便方式获得服务。我还与DIC一起工作,而DIC基本上只是一个手工制造的巨型工厂,其方法调用其他方法来返回服务。这实际上取决于您的需求。它不是漂亮的代码,但它可以工作。对于小型项目,DIC过于强大,因为您可以轻松使用Builder或专用的工厂。
@戈登谢谢你,戈登!我还将看一下从未听说过的RG Injektor!是的,代码要漂亮,我已经写信给作者,以提供正确的格式并添加注释!
只是为了完成戈登所说的话:
Yes, DICs need upfront Configuration, either in some config file or
through stacking together factory closures or by annotating your
source code.
这里最简单/最快捷的方法是注释,请查看以下示例:
class Loader {
//...
}
class MyController {
/**
* @Inject
* @var Loader
*/
private $loader;
public indexAction() {
// You can use $this->loader
}
}
在此示例中,依赖项(加载程序)已通过注释注入:代码清晰,可读,您无需编写任何配置文件。这是IMO最简单的解决方案。
如果您对这种方法感兴趣,我以PHP-DI为例,PHP-DI是一个使用注释的依赖注入框架(我在上面工作)。