我对使用依赖注入设计代码框架有一些疑问:
FLOW3或Doctrine使用Annotations将类实例注入对象属性。这是通过代码反射完成的......性能是baaaaad:D
您如何看待这种方法?
class Test extends Injector {
protected $abc = '@Inject:/namespace/classname';
}
Injector只是遍历类属性并查找字符串是否以@Inject
开头并创建给定类的对象。
它很酷还是很糟?
答案 0 :(得分:1)
如果您没有使用带有Doctrine注释的缓存(这比您的解决方案更优雅,那么调试将非常困难[除了您需要一个字符串之外,这实际上是唯一的问题) '@Inject'在其中]如果出现问题),那么你做错了。在生产环境中,如果正确设置缓存(see the docs),则不会有任何问题:)
答案 1 :(得分:1)
嗯..使用反射工作很慢。这是无可争辩的。但是有一个可行的解决方法:使用APC缓存每个类实例的依赖项。
那就是说,你必须明白,你所说的不是依赖注入(它是设计模式),而是依赖注入容器(DIC)。
DIC通常是框架(或部分框架),它们试图自动化在代码中使用依赖关系的过程。这个通常和服务定位器(一个漂亮的“全球注册表”)anitpattern,具有不同程度的危害。
所以...我的建议是: