正确的模式和依赖注入

Right pattern and dependency injection

我在决定正确的方法或编写模块时遇到问题。我想我知道依赖注入背后的理论以及它的优点是什么,但也许我正在混合一些东西或者没有一个非常清晰的图像。

一个相当简单的例子是:

我有一个对象模型,在这里我注入了一个验证器 class 来处理各种验证:

// index.php
// ......
$model = new Model();
$model->setValidator(new Validator());
$model->getValidator()->exampleValidateCall();
// ......

// validator.php
class Validator implements ValidatorInterface {

   //.....

   public function exampleValidateCall() {
      // code goes here
   }
}

我的问题是我需要访问设置实体 来定义模型的行为。因为设置定义了模型,所以我认为我不应该在验证器中传递这些设置。

一个选项是验证器将扩展模型,但我认为这将是不好的做法(因为整个依赖注入概念是否会成功?)。我可以做类似的事情:

$model->setValidator(new Validator($model->getSettings()));

但从我的角度来看,这看起来更加愚蠢。

从我的角度来看,一个更好的解决方案是将一个新对象传递给验证器构造函数

$model->setValidator(new Validator(new Settings()));

因为在现实中设置与模型没有依赖关系,但这似乎有点太复杂了。而且设置实体是在模型内部构建的,因为它违背了某些行为。

编写这些对象/依赖项的最佳实践是什么?

DI 的经验法则是,如果 Validator 需要 Settings 来操作,那么它应该被传递到构造函数中。如果它可以在没有设置的情况下运行,那么您可以使用添加依赖项 post 实例化。您的情况的另一个选择可能是将其传递给将在其中使用的方法。

$model->setValidator(new Validator());
$model->validator($thingToValidate, $model->getValidationSettings());

这不适合发表评论,所以我发布作为答案。

$model->setValidator(new Validator($model->getSettings()));

but this looks even more idiotic from my point of view.

这一点也不白痴。这是一个完全有效的结构,甚至尊重 Law of Demeter.

这里的主要问题是将您的设置存储在您的模型中是否有意义,或者它应该是一个单独的不同对象,如您所指出的:

$model->setValidator(new Validator(new Settings()));

如果您正在构建一个可以用来参数化业务规则的通用验证器,我认为将这些设置放在您的模型中是有效的。

否则,如果此验证是特定于实体的,我认为作为不同的结构会更好。