У меня вопрос по поводу внедрения зависимости.До сих пор я придерживался простого подхода, моя методология в основном состоит в том, чтобы отделить создание объектов внутри объектов и передать их вместо этого в конструктор.Я дошел до того, что нападаю на большие классы, требующие нескольких обектов.У некоторых даже есть объекты, которые содержат другие объекты, с веселыми маленькими синглетонами здесь и там.Тестирование этих классов становится ужасно быстрым, поскольку они далеко не «изолированы», они все еще жестко запрограммированы в зависимости.
Итак.Внедрить объект или 2 для тривиального класса просто,
Я изучил контейнеры зависимостей, увидел много реализаций и теперь задаюсь вопросом, в чем преимущество использования контейнера по сравнению с реестром, например.Разве нельзя так просто использовать реестр для хранения анонимных функций, которые создают необходимые зависимости при вызове?
2 контейнера, в которые я заглянул, Php Dependency и Pimple сильно отличаются в реализации.
Я задаюсь вопросом о преимуществах пользовательского контейнера по сравнению с проходящими прямыми объектами.Я не понимаю, как будет проверяться реализация php-зависимости, т.е. как реализовать фиктивный объект базы данных в phpunit без фактического внедрения класса при тестировании?Есть ли преимущество в том, чтобы зависимость отображалась и использовалась в doctag вроде этого?
Class Book {
private $_database;
/**
* @PdInject database
*/
public function setDatabase($database) {
$this->_database = $database;
}
}
Pimple, с другой стороны, использует совершенно другой подход.Нет тегов docblock, нет сопоставления в отдельном файле, это похоже на какой-то упорядоченный реестр ....
Objects are defined by anonymous functions that return an instance of the object:
// define some parameters
$container['cookie_name'] = 'SESSION_ID';
$container['session_storage_class'] = 'SessionStorage';
... который может вести себя как фабрика одновременно:
$container['session'] = function ($c) {
return new Session($c['session_storage']);
};
Объявление общих ресурсов всегда обслуживает один и тот же экземпляр (синглтон!?):
$c['session'] = $c->share(function ($c) {
return new Session($c['session_storage']);
});
Это была идея использования простого реестра, который содержит объекты или анонимные функции.Но я что-то упускаю в этом подходе?Прыщ, я вижу, как тестировать, но Php-зависимость мне неясна с точки зрения тестирования.