Dependency injection - is there an alternative to this very large constructor?
不久,我决定为即将编写的新PHP应用程序使用依赖项注入技术。
但是,我不完全确定我是否理解它。我的问题是,基类依赖于各种项目,而许多不同的类需要对其进行扩展。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | namespace system; class baseClass { protected $logger; protected $filter; protected $database; protected $session; public function __construct(LoggerInterface $logger, filterInterface $filter, databaseInterface $database, sessionInterface $session) { $this->logger = $logger; $this->filter = $filter; $this->database = $database; $this->session = $session; } } |
大多数类将需要记录器、过滤器等来完成它们的工作:例如,过滤器类处理转义/验证,这是我在整个项目中需要的。
我预测的问题是,当(几乎)所有对象都扩展这个基类时,每当我需要实例化一个非常简单的类(但不是简单到不需要上面描述的项),我都会处理一个可能需要很多参数的构造函数。
例如,当创建"car"类的对象时,我可以这样做:
1 | $car = new Car($color,$amountOfWheels); |
但这对我来说似乎相当混乱:
1 | $car = new Car($logger, $filter, $database, $session, $color, $amountOfWheels); |
我正在寻找这个问题的解决方案,当然,这并不违反DI范式。也许某种工厂模式会有所帮助,但是为每个小对象创建一个工厂类对我来说似乎有点过分了。
如何使用dbContext对象:
1 | $dbContext = new DbContext($logger, $filter, $database, $session); |
那么你的"车"是:
1 | $car = new Car($dbContext, $color, $amountOfWheels); |