Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (4) 1 2 [3] 4  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Обсуждения DI
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Дело все в том, что ты смотришь на 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
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




twin
Цитата
Задача №1:

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

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

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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




класс News использует объект (экземпляр) класса Config , Config использует объект (экземпляр) класса DB
Перечитай в таком духе =)


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




Цитата
Собственно твой класс, это самая что ни наесть абстрактная фабрика с помесью сервис-локатора.

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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Цитата (Arh @ 25.10.2015 - 16:08)
класс News использует объект (экземпляр) класса Config , Config использует объект (экземпляр) класса DB

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

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



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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




Цитата
Странная логика.

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

Вот без всяких 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();


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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


И что меняется... Почему база в конфиг передается, а не наоборот?


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


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

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


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




Цитата
мало того, что запрос в конструкторе, так еще и таблица захардкожена.

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

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


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Цитата (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
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Цитата (Arh @ 25.10.2015 - 18:09)
А что значит захардкорена таблица?
Это таблица специально для этого класса, такая архитектура бд, мне её из воздуха брать? =)

Ну так и назови тогда класс соответственно. Какой же это конфиг. Чего людей путаешь. smile.gif


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2107
Пользователь №: 27172
На форуме: 5 лет, 8 месяцев, 4 дня
Карма: 70




twin
Цитата
Сервис, это то, что складывается в контейнер. Он не должен ничего запускать.

Я имел ввиду контроллер модуля.

Цитата
Ну так и назови тогда класс соответственно. Какой же это конфиг. Чего людей путаешь.

Как? Settings ?


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 3 дня
Карма: 299

Трезвый :
5 лет, 11 месяцев, 12 дней


Цитата (Arh @ 25.10.2015 - 19:04)
Как? Settings ?

Ну да... Я бы еще по принадлежности назвал. Как там таблица называется. Как то SytemSettings или что-то в этом духе.


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (4) 1 2 [3] 4  Ответ в темуСоздание новой темыСоздание опроса