我最近了解了DI框架Guice和Ninject,并希望在一些新项目中使用它们。
虽然我熟悉通用的依赖注入概念,也知道如何使用这些框架构建对象图,但是当涉及到动态应用程序行为时,我很难应用IoC。
考虑以下示例:
- 应用程序启动时,将显示主窗口。
- 当用户单击主面板时,会打开上下文菜单。
- 根据用户的选择,在鼠标位置处创建并显示新的用户控件。
- 如果用户最终决定关闭应用程序,则会显示确认框,并在确认后关闭主窗口。
虽然很容易将主窗口的视图连接到Presenter / ViewModel,然后将其绑定到域逻辑,但我不明白如何以干净(从IoC的角度)的方式实现以下任务:
- 动态实例化具体的UI控件(例如
IGreenBoxView
,IRedImageView
<--JConcreteGreenBoxView
,JConcreteRedImageView
),而不使用任何服务定位器模式(例如从IoC再次请求)- 根据此创建新的模型、Presenter和视图实例
- 类似地,在运行时实例化一个新的具体对话框,例如
JOptionPane
我看到了一些使用抽象工厂的解决方案,但老实说我没有完全理解它们。这种解决方案似乎会导致将某些(视图域的、Presenter域的等)内部类型暴露给构造根,并由此暴露给整个世界。
那么,我该怎么做才能做到正确呢?