Ken*_*nic 6 .net wpf dependency-injection ioc-container inversion-of-control
我正在使用MVC架构和IOC容器来处理WPF应用程序.目前,我正在努力解决涉及某些容器提供组件的范围和寿命的设计问题.情况就是这样.
我将概括地说IOC容器支持两个组件生命周期,单例和瞬态.但我们需要的是某些组件的中间立场.
考虑一个显示网格中记录列表的视图.当用户单击记录时,将打开一个新视图以显示记录详细信息并允许编辑.用户可以打开许多这样的视图,每个视图显示不同的记录.每个视图也有自己的模型和控制器.
在给定的模型 - 视图 - 控制器集的上下文中,存在诸如对话的一些组件,这些组件既是瞬态的又是惰性注入的.也就是说,每当我们需要显示一个实例时我们想要一个新实例,并且由于大多数这些瞬态仅在用户采取某些操作时才需要,我们最初只注入一个工厂代理.然后根据需要调用委托以执行实际的依赖项解析.
除了模型,视图和控制器之外,还有许多其他组件,我们希望每个mvc设置一个实例.例如,我们正在实现NHibernate会话模式,该模式要求在视图打开时打开会话并保持打开直到它关闭.同样,每个集合都需要自己的共享事件代理和可能的一些"其他事情".如果在创建视图时解决了所有这些依赖关系,那么这不会成为问题.我们可以将它们全部声明为瞬态并完成它.
但是,其中一些懒惰解决的依赖项本身依赖于模型,控制器或"其他东西".所以问题是,在解决延迟依赖时,委托后面的容器需要注入每个依赖项的正确实例.这当然意味着委托本身以某种方式与mvc集相关联,但如果可以解决更大的问题,这应该不是问题.
在上面我说过,我过度简化了支持的生命周期列表.大多数容器支持一些中间生命周期,例如每线程或预请求,这允许在概念上类似于我们正在寻找的范围.但这些不适用于交互式UI场景.并非每个视图都在其自己的线程上或在其他方便的上下文中提供作用域的基础.
因此,我的问题是,使用IOC容器实现每个视图(或任意任意上下文)组件生命周期的最佳方法是什么.我们目前的容器是Unity,但我们已经很好地抽象了我们可以在没有太多困难的情况下切换.因此,如果这更容易在另一个容器中实现,或者由另一个容器实现,我们可以考虑切换.
您描述的模式是工作单元。您是正确的,因为它很容易为 Web 请求定义,但错误的是它不适用于交互式 UI 场景。视图本身是范围界定的上下文 - 您知道何时移动到它和远离它,并且这些是您分别创建和销毁子容器的点:
| 归档时间: |
|
| 查看次数: |
428 次 |
| 最近记录: |