【问题标题】:Child containers in MvvmCross IoCMvvmCross IoC 中的子容器
【发布时间】:2013-05-07 01:15:32
【问题描述】:

我有一个 WPF MVVM 应用程序,我想重构它以使用 MvvmCross 来支持 Android 实现的 WPF 和 Mono。

目前我们正在使用 Unity 3.0 进行依赖注入,并依赖于它对容器层次结构的支持(一个主容器,带有主视图和视图模型和服务;对于每个与服务器的会话,一个带有视图、视图模型的子容器和具有有限生命周期的服务)。 MvvmCross 中的 IoC 可以支持子容器吗?如果不是,您会如何建议以与 MvvmCross 兼容的方式实现外部 IoC?

更新: 我们不需要支持多个子容器——任何时候只有一个子容器处于活动状态。

谢谢!

【问题讨论】:

    标签: mvvm inversion-of-control ioc-container mvvmcross


    【解决方案1】:

    目前的 MvvmCross 框架主要针对“移动”和“平板电脑”开发。在这方面,到目前为止我遇到的需要多个容器的情况并不多,因此框架采用了简单的单容器方法。

    如果您确实想要/需要多个容器,那么 MvvmCross 的设计目的是让您可以根据需要覆盖所有内容。因此,如果您想覆盖使用的 IoC 库,那么您应该能够使用任何 PCL IoC 容器(或注入不同的本地容器)。对于其中的每一个,您都需要为我们的 IoC 接口提供一个适配器 - 请参阅 IMvxIoCProvider.cs


    除此之外,虽然我不完全了解您当前的需求(我比文字更了解代码!),但可能适合您特定问题领域的其他可能性包括:

    • 您始终可以为 MvvmCross 对象保留当前的 ​​MvvmCross 容器,但为您的类使用单独的 IoC 系统。虽然有点过时,但这个blogpost about creating a custom Custom ViewModelLocator 帮助@gshackles 一路使用 TinyIoC 和构造函数注入 - 看看他在https://github.com/gshackles/CrossBar 中构建了什么

    • MvvmCross 容器允许您在需要时替换解析器 - 即,如果您为接口 IMyService 注册了一种类型,则注册第二种类型将替换第一种。

    • 您可以在主 MvvmCross 容器中注册第二个 IoCContainer - 这样做您可以通过该第二个容器提供您的子对象。这可能不是完美的构造函数注入,但应该允许您密切控制子容器生命周期

    • 通过一些小的更改(继承),您可以轻松地创建 current 'simple' MvvmCross container 的多个副本 - 目前唯一迫使该对象成为单例的是它的继承。

    • 进行一些小的更改(virtual 添加到接口方法中),您还可以考虑从 SimpleContainer 继承以覆盖功能并提供多个解析器字典。

    总的来说,我认为您应该有很多选择...不过,需要注意的一件事是确保您了解每个应用程序平台上容器的生命周期。 WPF 生命周期很简单 - 应用程序启动,应用程序退出 - 但 WindowsPhone、WindowsStore 和 Android 应用程序可以以不同的方式启动(快捷方式、墓碑、搜索等)

    【讨论】:

    • 谢谢,斯图尔特。对于我们的场景,我认为我也许可以放弃子容器并根据需要调用 RegisterSingleton() 来替换我的服务对象单例。这可能允许我使用 MvvmCross 的内置 IoC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多