Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 22.08.07 18:43
Оценка:
Есть одна небольшая заминка (хотя, возможно, это я не понимаю что тут к чему).

Пусть имеем такой код (конфиг для Windsor'а очевиден, приводить не буду):
class c1 {
    public c1(c2 a) { ... }
    ...
}

class c2 {
    public c2(c3 b) { ... }
    ...
}

class c3 {
    public c3() { ... }
    ...
}

Пусть используется с1. Как только его запросят у IoC-контейнера — тут же будут инстанцированы и с2 и с3. Но что, если с2 и с3 используются только в редких случаях? Получается использование ресурсов вникуда...

Особенно это хорошо заметно, если в качестве компонентов брать формы в WinForms-клиенте. Фактически, получается, что все формы создаются сразу, что создает заметную задержку при старте. Хотя некоторые из этих форм вызываются один-два раза за все время эксплуатации приложения.

Это действительно проблема, или я не заметил какого-то простого решения вопроса?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Вопрос про IoC (Windsor container)
От: Cyberax Марс  
Дата: 22.08.07 18:50
Оценка:
Здравствуйте, Ivan Danilov, Вы писали:

ID>Пусть используется с1. Как только его запросят у IoC-контейнера — тут же будут инстанцированы и с2 и с3. Но что, если с2 и с3 используются только в редких случаях? Получается использование ресурсов вникуда...

А как ты себе представляешь создание c1 БЕЗ его зависимостей c2 и с3?

ID>Особенно это хорошо заметно, если в качестве компонентов брать формы в WinForms-клиенте. Фактически, получается, что все формы создаются сразу, что создает заметную задержку при старте. Хотя некоторые из этих форм вызываются один-два раза за все время эксплуатации приложения.

Почему? У тебя что-то неправильно с кодом, который их используется.
Sapienti sat!
Re[2]: Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 22.08.07 18:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Ivan Danilov, Вы писали:


C>А как ты себе представляешь создание c1 БЕЗ его зависимостей c2 и с3?

Простейшее решение — синглтон, который будет инстанцирован только при обращении (ногами не пинать, я просто констатировал факт).
Можно в самом Виндзоре сделать вместо объекта — его прокси, который будет только перенаправлять запросы на реальный объект. А пока запросов нет — вообще ничего не делать.

C>Почему? У тебя что-то неправильно с кодом, который их используется.

Ну представь себе: главная форма и форма настроек. Форма настроек используется главной формой? Используется. Т.е. должна быть отражена в зависимостях — в прототипе конструктора. Но реально настройки используются редко, по сравнению с рабочими формами (один раз настроил и ладно).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Вопрос про IoC (Windsor container)
От: Aviator  
Дата: 22.08.07 19:13
Оценка:
Здравствуйте, Ivan Danilov, Вы писали:
ID>Ну представь себе: главная форма и форма настроек. Форма настроек используется главной формой? Используется. Т.е. должна быть отражена в зависимостях — в прототипе конструктора. Но реально настройки используются редко, по сравнению с рабочими формами (один раз настроил и ладно).
Для таких вещей давно придумали lazy loading .
Re[4]: Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 22.08.07 19:17
Оценка:
Здравствуйте, Aviator, Вы писали:

A>Здравствуйте, Ivan Danilov, Вы писали:

ID>>Ну представь себе: главная форма и форма настроек. Форма настроек используется главной формой? Используется. Т.е. должна быть отражена в зависимостях — в прототипе конструктора. Но реально настройки используются редко, по сравнению с рабочими формами (один раз настроил и ладно).
A>Для таких вещей давно придумали lazy loading .
Осталось только объяснить сию банальную истину Windsor'у
Написать что-ли, команде разработчиков "пожелания к следующей версии"?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Вопрос про IoC (Windsor container)
От: Cyberax Марс  
Дата: 22.08.07 20:09
Оценка:
Ivan Danilov wrote:
> C>А как ты себе представляешь создание c1 БЕЗ его зависимостей c2 и с3?
> Простейшее решение — синглтон, который будет инстанцирован только при
> обращении (ногами не пинать, я просто констатировал факт).
Синглтон здесь нафиг не нужен — достаточно просто ленивой инициализации.

> C>Почему? У тебя что-то неправильно с кодом, который их используется.

> Ну представь себе: главная форма и форма настроек. Форма настроек
> используется главной формой? Используется. Т.е. должна быть отражена в
> зависимостях — в прототипе конструктора. Но реально настройки
> используются редко, по сравнению с рабочими формами (один раз настроил и
> ладно).
Тут два варианта:
1) Ленивая инициализаци с помощью прокси. Spring.NET так умеет.
2) Явно в коде основной формы делать lookup нужных ресурсов по требованию.
3) Самодельный "ленивый" стаб.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[4]: Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 22.08.07 20:21
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Синглтон здесь нафиг не нужен — достаточно просто ленивой инициализации.

Я привел, как один из вариантов. Не имелось в виду, что в такой ситуации его надо использовать.

C>Тут два варианта:

C>1) Ленивая инициализаци с помощью прокси. Spring.NET так умеет.
ну, чуть выше я как раз про этот способ написал.

C>2) Явно в коде основной формы делать lookup нужных ресурсов по требованию.

А это уже не IoC будет...

Да и вообще, мне было интересно именно в контексте Windsor'а... видимо, никак.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Вопрос про IoC (Windsor container)
От: IB Австрия http://rsdn.ru
Дата: 22.08.07 20:52
Оценка:
Здравствуйте, Ivan Danilov, Вы писали:

ID>А это уже не IoC будет...

IoC.

ID>Да и вообще, мне было интересно именно в контексте Windsor'а...

Ну это уже проблемы Windsor'а, а не IoC.
Мы уже победили, просто это еще не так заметно...
Re[6]: Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 22.08.07 21:07
Оценка:
Здравствуйте, IB, Вы писали:

ID>>А это уже не IoC будет...

IB>IoC.
Если явно передать контейнер главной форме — с натяжкой назвать IoC еще можно. Но стоит появиться еще "подглавной форме", для которой также нужен такой lookup ресурсов — и такой IoC станет больше похож на костыли, чем на паттерн.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Вопрос про IoC (Windsor container)
От: TK Лес кывт.рф
Дата: 22.08.07 21:28
Оценка: 4 (1)
Здравствуйте, Ivan Danilov, Вы писали:

ID>Пусть используется с1. Как только его запросят у IoC-контейнера — тут же будут инстанцированы и с2 и с3. Но что, если с2 и с3 используются только в редких случаях? Получается использование ресурсов вникуда...


ID>Особенно это хорошо заметно, если в качестве компонентов брать формы в WinForms-клиенте. Фактически, получается, что все формы создаются сразу, что создает заметную задержку при старте. Хотя некоторые из этих форм вызываются один-два раза за все время эксплуатации приложения.


Реализовать подобную Facility не особенно сложно — поддержка proxy уже есть. Например, можно взять TypedFactory facility, DynamicProxy для создания Lazy оболочек и написать create метод который будет дергаться через TypedFactory и создавать Proxy для нужного компонента. Или можно взять исходный код TypedFactory и сделать на его основе LazyFactory

ID>Это действительно проблема, или я не заметил какого-то простого решения вопроса?


А насколько правильно регистривать экземпляры форм как компоненты контейнера? У формы может быть куча заморочек с их соданием/удалением, доступом из разных потоков, повторным использованием из нескольких компонент... Не лучше будет регистрировать компонент с названием "менеджер формы" который будет отвечать за ее создание/удаление и т.п? В любом случае, если компонент по своей природе "особо не нужен" то, его можно спросить у контейнера явно.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[7]: Вопрос про IoC (Windsor container)
От: IB Австрия http://rsdn.ru
Дата: 23.08.07 05:36
Оценка:
Здравствуйте, Ivan Danilov, Вы писали:

ID>Если явно передать контейнер главной форме — с натяжкой назвать IoC еще можно.

Без натяжек.

ID>Но стоит появиться еще "подглавной форме", для которой также нужен такой lookup ресурсов

Такой — это какой?

ID> — и такой IoC станет больше похож на костыли, чем на паттерн.

Ты случаем не путаешь IoC и IoC-контейнер?
Мы уже победили, просто это еще не так заметно...
Re[2]: Вопрос про IoC (Windsor container)
От: Ivan Danilov Украина  
Дата: 23.08.07 15:49
Оценка:
Здравствуйте, TK, Вы писали:

TK>...


Спасибо за конструктивный ответ
Первый в этой теме
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.