Смешивать сервисы и конечные объекты в конструкторе для внедрения зависимостей? - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь сделать мой код максимально тестируемым, что означает правильное использование внедрения зависимостей.

Я прочитал, что можно использовать new () для создания экземпляра объекта, если этот объект соответствует определенным критериям .Примечательно, что он не должен принимать «non newable» в своем конструкторе.

Например, я должен иметь возможность перейти на

new Form('signup');

, потому что мой контейнер DI никак не узнаеткак создать форму «регистрации» заблаговременно.

Я могу сделать эту работу большую часть времени, но теперь я бы хотел, чтобы форма могла себя проверять, используя сторонний валидатор, например:

$form->validate()->isValid();

... это означает, что мне нужно будет передать службу валидатора.

Я бы действительно предпочел включить валидатор уже, потому что в большинстве случаев форманужно будет проверить, и мне придется пройти через дополнительную работу, чтобы установить валидатор самостоятельно.

Это нормально, в данном случае сделать:

new Form(Validator $validator,$name); 

1 Ответ

1 голос
/ 09 марта 2012

Я бы сказал, что любое значение или объект, который требуется объекту для того, чтобы быть в допустимом состоянии, является одной из зависимостей этого объекта;в вашем примере это будет полностью обоснованно включать имя формы.Я не думаю, что тип зависимости можно использовать, чтобы сказать, должна ли она быть введена или нет - например, Мартин Фаулер в этой статье показывает объекты, в которые вставлены строки, а контейнеры DI обычносконфигурирован для предоставления строковых значений.

Имея это в виду, инъекция валидатора и строки в порядке и, на мой взгляд, совершенно корректна.

...