正确的模式和依赖注入
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()));
如果您正在构建一个可以用来参数化业务规则的通用验证器,我认为将这些设置放在您的模型中是有效的。
否则,如果此验证是特定于实体的,我认为作为不同的结构会更好。
我在决定正确的方法或编写模块时遇到问题。我想我知道依赖注入背后的理论以及它的优点是什么,但也许我正在混合一些东西或者没有一个非常清晰的图像。
一个相当简单的例子是:
我有一个对象模型,在这里我注入了一个验证器 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()));
如果您正在构建一个可以用来参数化业务规则的通用验证器,我认为将这些设置放在您的模型中是有效的。
否则,如果此验证是特定于实体的,我认为作为不同的结构会更好。