我有一个WPF MVVM应用程序,我想重构使用MvvmCross来支持WPF和Mono for Android实现。
目前我们正在使用Unity 3.0进行依赖注入,并依赖于它对容器层次结构的支持(一个主容器带有主视图和视图模型和服务;并且对于每个会话与服务器一个带有视图的子容器,视图模型和有限寿命的服务)。 MvvmCross中的IoC可以支持子容器吗?如果没有,您会如何建议以与MvvmCross兼容的方式实现外部IoC?
更新 我们不需要支持多个子容器 - 任何时候只有一个子容器处于活动状态。
谢谢!
答案 0 :(得分:3)
目前的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应用程序可以以不同方式启动(快捷方式,逻辑删除,搜索等)