[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Колупаем DI Container
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
chee
Цитата (twin @ 26.01.2021 - 10:30)
Да почему не должно то? Именно так и должно работать.

Ты запустил этот пример? Ты вообще понял в чем проблема? Если ты считаешь это поведения правильным, то тогда и то что память из-за этого поведения течет, считай тоже правильным. Тот контейнер адаптер, который я написал к течи памяти не имеет никакого отношение, я проверил, течет все из за этого поведения твоего контейнера.

Цитата (twin @ 26.01.2021 - 10:18)
Я на святое наверное позарился, но исходник я твой покоцаю маленько. Не против? smile.gif

Ты сам себе этим делаешь хуже, вместо того что бы подгонять свой контейнер под разные сценарии использования, делать его гибким, ты начинаешь адаптировать код под свой контейнер. То есть по факту ты расписываешься в том, что твой контейнер это не умеет и у тебя нет выхода кроме как править систему. А я точно знаю, что твой контейнер это не умеет, точнее умеет но только через анонимные функции, как Pimple.
Цитата (twin @ 26.01.2021 - 10:18)
Миксовать типы внедрения, это что то новое, так ни кто не делает.

Никто не делает, но все умеют. Pimple это точно умеет, PHP DI судя по коду тоже, мой контейнер точно умеет. Твой же монстр считает себя крутым для этого дерьма? Давай я отвечу, он тупо этого не умеет


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 26.01.2021 - 07:32)
Ты запустил этот пример? Ты вообще понял в чем проблема?
Да, запустил. И ничего не понял, в чем проблема. Все инстанцирования запакованы в замыкания. Если нужен новый объект, его нужно распаковать. Объект Closure хранится один, то, что из него каждый раз получается новый инстанс, это нормально. В чем проблема то?

Цитата (chee @ 26.01.2021 - 07:32)
Твой же монстр считает себя крутым для этого дерьма? Давай я отвечу, он тупо этого не умеет
Да умеет он, ты сам же делал. Через замыкание. Только это некрасиво, хак получается, подгонять функционал под кривые системы мне не камильфо.



_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Все, понял. Чет и впрямь не камильфо, не так было задумано(((

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
blink.gif

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Блин, опять чуть не сбил меня с толку, я уже полез баг искать. Все правильно работает, как задумано.

Метод getNew() возвращает новый объект, и естественно с новыми зависимостями, как бы ты их не объявлял. Он совсем новый, это к вопросу о складе и Маривановне. Нельзя раздавать одни и те же зависимости по разным объектам.

Вот такой тест запусти с get() и getNew(), и увидишь, что все нормально работает и никаких утечек.
class TestService
{
public $container;

public function test()
{
usleep(300);
var_dump($this->container);
}

}

$container = new \ABCDIC\Container;
$container->typeProperties(true);
$container->setMaps([
'a' => [
TestService::class,
'container' => 'container',
],
], [

'container' => [
function () use ($container) {

return microtime(true);
}
]
]);


for ($i = 0; $i < 10; $i++) {
$container->get('a')->test();
}


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
twin, мне нужен 'a' всегда новый, а container в нем один и тот же. Зачем мне 'a' как сервис?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Я же говорил, что не делал декларацию заранее. Пока не видел надобности. Мое убеждение таково, что если новый, то совсем новый. А то получается новый кафтан со старыми дырами.

Это не сложно сделать, только это провокация на неверное использование. Как кстати и внутренний контейнер, который ты повсеместно юзаешь как локатор. С этим тоже проблема возникла с моей картой. Но подстраивать функционал под твои хотелки я торопиться не буду. Если возникнет надобность зарегать в нем стороннюю кривую либу (что уже нонсенс), всегда можно захакать.

Сделать то, что ты гворишь, это значит затянуть в новый объект расшаренный сервис со своими зависимостями, которые могут потянуть другие сервисы со своими зависимостями, и все они будут одни и те же в новом объекте. Эта такая каша получится, мама не горюй.

Еще это усложнит синтаксис. Я, в отличие от тебя, готов делать монстров инкапсулировать сложность, лишь бы было легко работать с API. У меня вообще то фреймворк позиционировался как учебный.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 26.01.2021 - 12:48)
Еще это усложнит синтаксис.

Куда уже сложнее то? Я вообще не вижу смысла что-то менять в текущем синтаксисе, нужно менять код внутри контейнера, сама карта зависимостей +/- полноценная, а вот как ведет себя контейнер внутри и снаружи это мрак.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 26.01.2021 - 08:35)
мне нужен 'a' всегда новый, а container в нем один и тот же. Зачем мне 'a' как сервис?
Вот я не понял твой мысли. Зачем тебе "а" всегда новый? Зависимостью куда то сунуть, он и так всегда новый будет. Если ты зарегал его как сервис, как в тесте, то зачем там нужна расшаренная зависимость в новом объекте. Вообще IoC предполагает вынос инициализаций зависимостей за пределы класса. Но в классе то всегда получается новый объект. И зависимость должна быть новой.

Если требуется синглтон, то и нужно делать синглтон в классе, а не провоцировать на это контейнер. Не для того он.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (chee @ 26.01.2021 - 09:13)
Куда уже сложнее то?

Там видимая сложность, потому что большой функционал. На самом деле в повседневке из этого требуется процентов 10.

Ну нужно как то обозначить зависимость, чтобы она была расшареной. Ты это всяким суррогатным синтаксисом решаешь, я противник этого. Можно обернуть методом, как в пимпле, но я решительно не вижу надобности в таком функционале.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Давай я тебе поясню, что синтаксис тут не причем

Объявление карты у меня
$container = new \PDIC\Container([
'?a' => '*' . TestEntryAsFactory::class,
TestEntryAsFactory::class => [
'service' => TestEntryAsService::class,
],
]);


Объявление карты у тебя
$container = new \ABCDIC\Container;
$container->typeProperties(true);
$container->setMaps([
'a' => [
TestEntryAsFactory::class,
'service' => 'service',
],
], [

'service' => [
function () {
return new TestEntryAsService;
}
]
]);


Разница в синтаксисе этих карт зависимостей лишь в том, что один использует явные синтаксические маркеры (PDIC), другой структуру массива как синтаксический маркер (ABCDIC).
Но супер разницы нет, они решают задачу объявления карты зависимостей.

Проблемы в том как эти карты имплементируются контейнером:

PDIC:
'?a' => '*' . TestEntryAsFactory::class, // если в начале ключа стоит вопрос, значит это алиас для конкретного класс который указан в значении, в начала значения стоит * значит этот класс всегда будет возвращать по этому алиасу как новый
TestEntryAsFactory::class => // вопроса в начале ключа нет, значит это просто описание сущности в контейнере
'service' => TestEntryAsService::class, // в начале ключа нет никаких символов, значит будет внедрение через свойство, ключ в начале не содержит ни каких символов, значит по этому классу будут инициализирован объект и подставлен как сервис, если бы была звездочка, то был бы фабричный метод

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

ABCDIC:
$container->typeProperties(true); // Надо указать контейнеру, как он будет вести себя поумолчанию
$container->setMaps([ // введено понятие фабричных и сервисных сущностей
'a' => [ // объявили алиас для фабричной сущности, но эта сущность при запросе через get почему-то является сервисом, а при внедрении контейнером является фабрикой
TestEntryAsFactory::class, // указали класс
'service' => 'service', // указали зависимость, тип пока не знаем, но забегая вперед можно предположить чтобы это было как сервис
'service' => [ // объявили алиас для сервисной и фабричной сущности
function () { // готовим сущность по особенному, возвращаем результат в контейнер
return new TestEntryAsService;
} // объявили функцию для подготовки сервисной сущности, но по факту это фабричная сущность несмотря на то что она указана в блоке с сервисами. При том если объявить эту сущность через название класса, то эта сущность будет сервисом.

Нужно париться на счет контекстов выполнения, нужно понимать как контейнер в том или ином случае поведет себя, а в некоторых случаях он просто не позволяет сделать то что нужно, хотя судя по синтаксису карты он должен это делать.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.