L!MP, Ты хочешь чтоб DI контейнер был у тебя коллекцией?
# Delphinum (14.11.2016 / 16:05)
L!MP, Ты хочешь чтоб DI контейнер был у тебя коллекцией?
Ну да, чтоб не проксировать вызовы а работать сразу на прямую как я описал выше.
L!MP, ну во-первых DI контейнер это не коллекция, во-вторых если уж очень хочется, то можно агрерировать с делегированием:
class Container implements ContainerInterface, CollectionInterface{
private $collection;
... // реализация контейнера
// реализация интерфейса коллекции через делегирование
public function get($index){
return $this->collection->get($index);
}
...
}
Если лень, то можно и трейтом.
Delphinum, но отдельный класс коллекции все равно нужен, так что два раза описывать функционал я не буду.
К тому же интерфейс контейнера должен накладывать обязательства и по функционалу коллекции, гг.
Короче, видимо вопрос мой высосан из пальца, раз никто его не понимает хотя я уже и так и сяк объяснил.
Агрегация с делегированием это то, что у меня есть сейчас, но из-за этого нужно проксировать вызовы к коллекции отчего я хотел избавиться.
L!MP, ну контейнер это не коллекция как бы, я хз как ты их хочешь объединить. Понятие "Коллекции" определяет структуру хранения и доступа к группе данных, потому интерфейсы коллекций определяют методы доступа к данным для коллекций вида: множество, вектор, массив, список, etc.
Контейнер DI, как правило, не используется для описания структуры хранилища сервисов, ему обычно достаточно реализовать один метод вида: build($serviceName)
# L!MP (14.11.2016 / 16:14)
Агрегация с делегированием это то, что у меня есть сейчас, но из-за этого нужно проксировать вызовы к коллекции отчего я хотел избавиться.
ну если хочешь пользуй трей, проблем не вижу в этом никаких. Вопрос только в том, нужен ли тебе в системе доступ к DI как к коллекции? Что ты там с этим контейнером такого собрался делать? ))
Delphinum, ну поэтому я и назвал ее не Collection, а Collector гг.
Мог бы назвать BindingAggregate, BindingBag или как то ещё.
Понятное дело что это не коллекция, там нет ни итератора ничего, просто оберка над, фактически, массивом. Хранилище биндингов с методами добавления/проверки существования/получения/удаления.
L!MP, а зачем тебе тогда отдельно коллектор и контейнер? Ты собираешься использовать коллектор где то вовне или он может быть заменен другой реализацией коллектора? Зачем вообще тебе наружу из контейнера выносить интерфейс коллектора?
Delphinum, контекстный биндинг.
Есть же как бы глобальный коллектор биндингов, а есть пул коллекторов содержащих биндинги для определенного контекста.
Короче да, отдельно коллектор нужен и интерфейс его нужен.