IoC/DI-контейнеры, фабрики и создание типов во время выполнения

Недавно я узнал о DI-фреймворках Guice и Ninject и захотел использовать их в некоторых своих новых проектах.

Хотя я знаком с общими концепциями внедрения зависимостей и знаю, как использовать эти платформы для построения графов объектов, мне трудно применять IoC, когда речь идет о динамическомповедении приложения.

Рассмотрим следующий пример:

  • При запуске приложения будет показано главное окно.
  • Когда пользователь щелкает главную панель, открывается контекстное меню.
  • В зависимостиот выбора пользователя, новыйпользовательский элемент управления будет создан и показан в позиции мыши.
  • Если пользователь в конце концов решит закрыть приложение, будет показано окно подтверждения, и - после подтверждения - главное окно будет закрыто.

Хотя представление главного окна легко связать с Presenter/ViewModel, а затем связать это с логикой предметной области, я не понимаю, как чисто(в смысле IoC) достичь следующие задачи:

  • Динамическое создание экземпляраконкретного элемента управления пользовательского интерфейса (например, IGreenBoxView, IRedImageView<-- JConcreteGreenBoxView, JConcreteRedImageView) без использования какого-либо шаблона локатора сервисов (например, повторный запрос от IoC)
    • В зависимости от этого создайте новую модель, презентатор и экземпляр представления.
  • Аналогично создайте новое конкретное диалоговое окно, например. JOptionPaneво время выполнения

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

Итак, как правильно сделать?

7
задан sunside 9 March 2012 в 00:50
поделиться