我的两分钱在这里:
我正在重构一个php应用程序,我正在尝试进行尽可能多的依赖注入
您没有说明是否使用依赖项注入框架。我认为你绝对应该。使用可以为您提供所需功能的工具:https : //stackoverflow.com/questions/9348376/guice-like-dependency-injection-frameworks-in-php。
我现在遇到的问题是我实际上可以在什么时候创建新对象?看起来我将结束于顶级课程,创建新对象的负载,因为没有其他可去之处。这感觉不对。
通常,您使用配置或中心点来实例化组成您的应用程序的初始对象。容器将为您创建对象。
然后,您可以通过IoC容器访问对象(服务,提供者,控制器...)。如果需要,它将为您透明地创建一个对象,或者为您提供对适当的现有实例的引用。
当然,在对象的特定实现中,您可以实例化不需要DI的其他对象(数据结构,自定义类型等),但这是正常的编程。
我读过一些使用工厂类创建所有对象的博客,然后将工厂注入其他类中。然后,您可以调用工厂方法,然后工厂为您创建新对象。
通常,如果希望IoC框架通过工厂实例化某些IoC对象,则可以使用Factory(在实例化特定对象时需要做一些额外的工作)。如果可以使用“ new Object()”简单地创建对象并设置一些属性,则不必使用Factory模式。
换句话说,我会说对一个或一组类使用Factory模式取决于您要对这些类建模的方式,而不取决于您是否使用DI(除非您的DI实现明确要求工厂,这是不寻常的)。
您还可以将IoC框架配置为在使用已经需要使用Factory的3rd party库时使用Factory。在这种情况下,您对此无能为力,并且需要告诉您的IoC容器:“嘿,当我请求这些接口之一时,必须使用该工厂为我提供适当的实例”。
我担心这样做,因为现在我的工厂班级将成为新的免费课程!我想这可能是可以的,因为它们是工厂类,但是在使用工厂模式和DI时有一些规则要遵守,否则我将偏离正常范围。
在这种情况下,听起来您不需要为这些对象/服务/控制器/任何对象使用Factory模式,并且只需配置IoC即可使用“新”实例化适当的类并注入其他所有内容。
希望对您有所帮助。