6

我正在使用MVC体系结构和IOC容器的WPF应用程序。目前,我正在酝酿涉及某些容器提供组件的范围和寿命的设计问题。这是情况。如何为IoC注入组件实现每视图生命周期

我将泛泛地说一些不正确的说法,即IOC容器支持两个组件生命周期,单例和瞬态。但是我们需要的是某些组件的中间立场。

考虑一个显示网格中记录列表的视图。当用户点击一条记录时,将打开一个新视图以显示记录详细信息并允许编辑。用户可以打开许多这样的视图,每个显示不同的记录。每个视图都有自己的模型和控制器。

在给定的模型 - 视图 - 控制器集的上下文中,存在一些组件,例如瞬态和延迟注入的对话框。也就是说,我们每次需要显示一个新实例时都需要一个新实例,并且由于大多数瞬态只在用户采取特定操作时才需要,因此我们最初只注入一个工厂代表。然后根据需要调用委托来执行实际的依赖关系解析。

除了模型,视图和控制器之外,还有一大堆其他组件,我们希望每个m-v-c组有一个实例。例如,我们正在实现NHibernate对话模式,该模式需要在视图打开时打开会话并保持打开状态直至关闭。同样,每个集合都需要自己的共享事件代理,并可能包含一些“其他事物”。如果所有这些依赖关系在创建视图时得到解决,那么这不会成为问题。我们可以宣布它们都是暂时的,并且可以用它来完成。

但是,其中一些懒惰解决的依赖关系本身依赖于模型,控制器或“其他事物”。所以问题是,在解析惰性依赖项时,委托后面的容器需要注入每个依赖项的正确实例。这当然意味着委托本身与m-v-c集合有某种联系,但如果可以解决更大的问题,这应该不是问题。

上面我说过,我简单列出了支持的生命周期列表。大多数容器支持一些中间生命周期,例如每个线程或预先请求,这允许在概念上类似于我们正在寻找的范围。但这些不适用于交互式UI场景。情况并非如此,每个视图都在自己的线程上,或者在为方案范围提供基础的其他方便的上下文中。

因此,我的问题是,使用IOC容器实现每个视图(或每个任意上下文)组件生命周期的最佳方式是什么。我们现在的容器是Unity,但我们已经抽出了自己的足够好,我们可以切换没有太多的困难。因此,如果这更容易在另一个容器中实现,或者由另一个容器实现,我们可以考虑切换。

回答

4

您描述的模式是工作单元。您说得很对,因为它很容易为Web请求定义,但在说明它不适用于交互式UI场景时不正确。该视图本身是作用域范围内 - 你知道,当你移动到它,远离它,而这些都是在你分别创建和销毁子容器点:

  1. 移动查看
  2. 创建子对于视图容器
  3. 从子容器
  4. 解决视图实例
  5. 做的工作
  6. 销毁子容器
  7. 移动远离视线
+0

我认为这种可能性,但是,我不清楚子容器和组件生命周期之间的关系。具体来说,不同的容器表现出不同的尊重。 Castle容器在同一层次中的所有容器上使用相同的单例实例。 Unity的ContainerControlledLifetimeManager,它的名字意味着相反的意思,即每个子容器都获得一组全部的容器控制组件。需要另一个终身管理者,在中间...... – 2010-12-01 16:17:19