mvvm - MvvmCross IoC 中的子容器

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

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

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

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

谢谢!

最佳答案

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

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

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

  • 你总是可以为 MvvmCross 对象保留当前的 ​​MvvmCross 容器,但为你的类使用单独的 IoC 系统。虽然有点过时,但这个 blogpost about creating a custom Custom ViewModelLocator在使用 TinyIoC 和构造函数注入(inject)的过程中帮助 @gshackles - 看看他在 https://github.com/gshackles/CrossBar 中构建了什么
  • MvvmCross 容器允许您在需要时替换解析器 - 即,如果您为接口(interface) IMyService 注册了一种类型,然后注册第二种类型将替换第一种。
  • 您可以注册第二个 IoCContainer使用主 MvvmCross 容器 - 这样做您可以通过第二个容器提供您的子对象。这可能不是完美的构造函数注入(inject),但应该允许您密切控制子容器生命周期
  • 通过一些小的更改(继承),您可以轻松地创建 current 'simple' MvvmCross container 的多个副本- 目前唯一迫使这个对象成为单例的是它的继承。
  • 通过一些小的更改(virtual 添加到接口(interface)方法),您还可以考虑从 SimpleContainer 继承以覆盖功能并提供多个解析器字典。

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

    关于mvvm - MvvmCross IoC 中的子容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514691/

    相关文章:

    javascript - 两种方式的数据绑定(bind)不适用于 knockout ObservableArrays

    c# - 贪婪构造和依赖注入(inject)

    c# - 异步 CTP,单元测试 ViewModel 的异步方法

    php - MVC和依赖注入(inject),被迫使用单例Controller?

    c# - 如何避免依赖注入(inject)构造函数的疯狂?

    wpf - 如果我使用 EntityFramework,是否必须在 ViewModel 中引发 PropertyChanged?

    asp.net-mvc - 将 Ninject 与 Udi Dahan 的领域事件结合使用

    silverlight - 如何获取unitycontainer的实例?

    java - @PostConstruct 注解和spring生命周期

    c# - 如何使用 Unity 将通用接口(interface)自动注册到该接口(interface)的非通用实现