我有一个关于依赖注入的问题。到目前为止,我一直保持简单的方法,即将对象创建从对象中分离出来,并在构造函数中传递它们。我已经达到了需要多个对象的大型类的点。有些甚至有包含其他对象的对象,其中有许多单例模式。当测试这些类时,情况会很快变得丑陋,因为它们远非“隔离”,仍然被硬编码到其依赖项中。
因此,对于一个简单的类注入一个或两个对象是直截了当的,
我研究了依赖容器,看到了许多实现,现在想知道使用容器与使用注册表等相比的优势。一个人是否可以轻松地使用注册表来保存匿名函数,在调用时创建所需的依赖项?
我窥视了两个容器, Php Dependency和 Pimple在实现上有很大的不同。
我想知道使用容器与直接传递对象的优势。我不明白php-dependency的实现如何进行测试,即在phpunit中如何实现模拟数据库对象而不注入实际类?将依赖关系映射并在doctags中使用是否有优势?
声明共享资源始终使用同一实例(单例?):
这是我得到使用一个简单的注册表来保存对象或匿名函数的想法的地方。但是,我在这种方法中漏掉了什么吗?对于Pimple,我可以看到如何进行测试,但从测试角度来看,Php-Dependency对我来说不清楚。
因此,对于一个简单的类注入一个或两个对象是直截了当的,
我研究了依赖容器,看到了许多实现,现在想知道使用容器与使用注册表等相比的优势。一个人是否可以轻松地使用注册表来保存匿名函数,在调用时创建所需的依赖项?
我窥视了两个容器, Php Dependency和 Pimple在实现上有很大的不同。
我想知道使用容器与直接传递对象的优势。我不明白php-dependency的实现如何进行测试,即在phpunit中如何实现模拟数据库对象而不注入实际类?将依赖关系映射并在doctags中使用是否有优势?
Class Book {
private $_database;
/**
* @PdInject database
*/
public function setDatabase($database) {
$this->_database = $database;
}
}
另一方面,Pimple采用了完全不同的方法。没有docblock标签,没有在单独文件中进行映射,它看起来像是一种强化版的注册表....
Objects are defined by anonymous functions that return an instance of the object:
// define some parameters
$container['cookie_name'] = 'SESSION_ID';
$container['session_storage_class'] = 'SessionStorage';
...同时可以作为工厂运行的代码:
$container['session'] = function ($c) {
return new Session($c['session_storage']);
};
声明共享资源始终使用同一实例(单例?):
$c['session'] = $c->share(function ($c) {
return new Session($c['session_storage']);
});
这是我得到使用一个简单的注册表来保存对象或匿名函数的想法的地方。但是,我在这种方法中漏掉了什么吗?对于Pimple,我可以看到如何进行测试,但从测试角度来看,Php-Dependency对我来说不清楚。