Я недавно узнал об основах DI Guice и Ninject и хотел использовать их в некоторых моих новых проектах.
Хотя я знаком с общими концепциями внедрения зависимостей и знаю, как использовать эти инфраструктуры для построения графов объектов, я изо всех сил пытаюсь применить IoC, когда дело доходит до динамического поведения приложения.
Рассмотрим этот пример:
- Когда приложение запустится, будет показано главное окно.
- Когда пользователь нажимает на главную панель, открывается контекстное меню.
- В зависимости от выбора пользователя, пользовательский элемент управления new будет создан и показан в позиции мыши.
- Если пользователь в конечном итоге решит закрыть приложение, появится окно подтверждения и - после подтверждения - главное окно закроется.
Хотя легко связать View главного окна с Presenter / ViewModel, а затем связать его с логикой домена, я не понимаю, как чисто (в смысле IoC) достичь следующие задачи:
- Динамически создавать конкретный элемент управления пользовательского интерфейса (например,
IGreenBoxView
, IRedImageView
<- <code>JConcreteGreenBoxView, JConcreteRedImageView
) без использования какого-либо шаблона поиска службы (например, повторный запрос от IoC )
- В зависимости от этого создайте новую модель, презентатор и экземпляр представления
- Аналогично, создайте новое конкретное диалоговое окно, например,
JOptionPane
во время выполнения
Я видел некоторые решения, использующие абстрактные фабрики , но, честно говоря, не до конца их понял. Похоже, что такое решение привело бы к тому, что некоторые внутренние типы (домена представления, домена презентатора, ...) были открыты корневому каталогу конструкции и, следовательно, всему миру.
Итак - как мне сделать это правильно?