[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обсуждения DI
Страницы: 1, 2, 3, 4
twin
Дело все в том, что ты смотришь на IoC, как на фабрику. Собственно твой класс, это самая что ни наесть абстрактная фабрика с помесью сервис-локатора. Ты все пытаешься оперировать классами. А нужно зависимостями. Не должен класс News вообще ничего знать о классе Config. Он должен просто ждать объект с конфигурацией. Какой это будет объект, какого класса, ему не важно.

Поэтому сначала набирается контейнер из объектов, а потом он их сам внутри уже тусит как нужно.
Цитата (Arh @ 25.10.2015 - 15:44)
Задача №1:
Последовательно запускаются классы News и Config
Как внедрить DB2 в класс News, что бы класс Config, который запускается внутри класса News продолжал работать с DB1

Вот видишь. У тебя класс Config запускается внутри класса News. Какое же это внедрение зависимости, если News совершенно определенно знает, что нужно запустить класс Config. А я может хочу там NewsConfig запустить. А в другом месте общий. Для того и внедрение, чтобы с объектами, а не с классами работать.


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

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

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

user posted image
Arh
twin
Цитата
Задача №1:

Первую задачу исправил =)

Цитата
Вот видишь. У тебя класс Config запускается внутри класса News. Какое же это внедрение зависимости, если News совершенно определенно знает, что нужно запустить класс Config.

Уточню, внутри класса News используется объект класса Config. Ничего там не запускается =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
класс News использует объект (экземпляр) класса Config , Config использует объект (экземпляр) класса DB
Перечитай в таком духе =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
Цитата
Собственно твой класс, это самая что ни наесть абстрактная фабрика с помесью сервис-локатора.

Кстати у меня нельзя пока что решить вторую и третью задачи вроде =)
тестить надо, я вчера переписал класс, что б попроще и без рефлексии, но чую он работает не так как хочется =)


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Цитата (Arh @ 25.10.2015 - 16:08)
класс News использует объект (экземпляр) класса Config , Config использует объект (экземпляр) класса DB

Странная логика. Как конфиг может использовать класс базы данных. Он должен только предоставить настройки. Для DB в том числе.

Должно наоборот быть. DB должен использовать класс Config. Слишком ты замудрил все.



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

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

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

user posted image
Arh
Цитата
Странная логика.

Да какая разница какой пример, задачи как решить? =)

Вот без всяких DIC

Задача 1:


$News = new News(new DB2());
$Config = new Config(new DB1());

$новости = $News->get(); //со 2 сервера
$настройка = $Config->get();//с 1 сервера


Задача 2:


$Config = new Config(new DB1());
$News = new News(new DB2(), $Config);

$новости = $News->get(); //новости со 2 сервера, по конфигу с 1


Задача 3:


$Config = new Config(new DB2());
$News = new News(new DB2(), $Config); //новости и конфиг со 2

$новости = $News->get();


Так понятнее? =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
И что меняется... Почему база в конфиг передается, а не наоборот?

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

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

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

user posted image
Arh
Допустим потому что это пользовательские настройки, которые лежат в базе

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Конфиг не должен по идее вообще ничего о базе знать. Он должен сформировать настройки из предоставленной информации, а не самому заниматься вытаскиванием её из базы. Странно это всё. Потому и сложности у тебя. Посмотрел, как сделано. Там мало того, что запрос в конструкторе, так еще и таблица захардкожена. В конструктор должен поступать результат запроса, а не база данных.

Я такую задачу решать не собираюсь. smile.gif Тут с архитектурой все напутано.

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

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

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

user posted image
Arh
twin
Цитата
Посмотрел, как сделано.


Я со вчера начал баловаться в новом месте =)
https://github.com/arhcmf/1
Но не суть.

Цитата
Конфиг не должен по идее вообще ничего о базе знать. Он должен сформировать настройки из предоставленной информации, а не самому заниматься вытаскиванием её из базы.

А кто ему эту информация предоставит, если настройки хранятся в базе?
У меня в базе лежат настройки модулей, класс Config их от туда достаёт и хранит в таком виде
$config['имя_модуля']['название_настройки'] = 'значение';


Где то в модуле в классе News они могут быть использованы
допустим
$this->Config->get('news','limit'); //Лимит новостей выводимых на страницу


Ну а вообще ты как всегда, начал копаться в моём гавнокоде, вместо того, что бы рассказать о своём =)

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

Мне сейчас по работе любопытна тема шардинга, вот я и задумался, и пример привёл на эту тему.
Могу классы называть A,B,C =)

Давай другой пример. Как бы с терминами друг друга понять.
Фреймворк запускает контроллер сервиса (модуля).
Сервис запускает твой DiC. или нет?
Передаёт его в свою модель которая выводит список пользователей.
Пользователи лежат в базе данных.

В итоге мы имеем class UsersController, class UsersModel и class acb\DB;

№ 1
Как заменить базу данных у UsersModel?

№ 2
Как ты говоришь, база зависит от конфига, то есть abc\DB использует abc\Config
Допустим UserModel тоже использует abc\Config
Как подменять abc\Config в UsersModel не подменяя его в UserModel -> abc\DB

№ 3
Тоже что и во второй, только как подменить abc\Config и в UsersModel и в UserModel -> abc\DB

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Arh
Цитата
мало того, что запрос в конструкторе, так еще и таблица захардкожена.

Запрос в конструкторе был, потому что я раньше везде использовал статику, которая данные получала из кэша, а кэш генерировал (если его нет) 1 раз с помощью new.

А что значит захардкорена таблица?
Это таблица специально для этого класса, такая архитектура бд, мне её из воздуха брать? =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Цитата (Arh @ 25.10.2015 - 18:05)
А кто ему эту информация предоставит, если настройки хранятся в базе?

Да база и предоставит, только снаружи. А данные коннекта ты тоже в базе хранишь? :) Как баз получит данные конфигурации? Или тогда это не конфига у тебя, а что-то другое. Не путай названия тогда.

Цитата (Arh @ 25.10.2015 - 18:05)
Сервис запускает твой DiC. или нет?

Сервис, это то, что складывается в контейнер. Он не должен ничего запускать.
Цитата (Arh @ 25.10.2015 - 18:05)
№ 1
Как заменить базу данных у UsersModel?

Сделать новый сервис. Всё тоже самое для остальных пунктов. На то и контейнер.

Контроллер вообще никакого отношения к контейнеру не имеет кстати.

Как что-то менять, я привел примеры. Допустим есть настроенный сервис db:
$dic->setGlobal('DB'
function() use ($connectData) {
return new DB($connectData);
}
);


Пользуемся сколько нужно. Можно внедрять её в другие сервисы. Допустим есть сервис новостей (условно)
$dic->set('News'
function() {
return new News;
}
);


Засовываем базу в новости:
$dic->injection('News', 'DB');


Если понадобилось несколько вариантов, значит вместо перезаписи делаем новые сервисы:
$dic->injection('News', 'DB', 'NewsFomDb');
$dic->injection('News', 'DB2', 'NewsFomDb2');


и работаем уже с ними:
Цитата
$newsFomDb = $dic->get('NewsFomDb');
$newsFomDb2 = $dic->get('NewsFomDb2');
Ну и так далее.

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

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

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

user posted image
Быстрый ответ:

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