Xamarin Forms、Prism Forms和IoC

3
我有一个使用Prism和Unity开发的Xamarin Forms应用程序。但是,我发现Unity在首次解析对象时相当缓慢,一旦第一次过去,所有后续相同对象类型的解析都会更快。
基于我在另一个线程上收到的一些无关建议,我决定尝试从Unity切换到DryIoc。不幸的是,我发现即使在解析新实例的那些相同对象类型时,它也比解析对象时更慢。
因此,我的问题是,有没有任何我可以使用这两个容器来提高性能的方法?例如...
- 在Unity中是否有任何方法可以预先配置可能创建的对象,以便第一次解析与后续解析一样快? - 我是否可以在DryIoc中做些什么来加速所有对象的解析?
供参考,我自己对每个容器的使用非常简单;我对大多数对象(设置、数据库等)使用RegisterInstance,并通过构造函数将它们注入到我的ViewModel对象中。Forms和ViewModel对象本身都使用Prism的RegisterTypeForNavigation扩展方法进行注册。

1
@dadhi可能能够为您指出一些优化建议。您还可以考虑将RegisterInstance替换为UseInstance。话虽如此,您确定是容器而不是应用程序中的其他问题吗?如果您查看基准测试,DryIoc是可用的较快容器之一。 - Dan Siegel
这就是我所想的,也是我为什么尝试切换到它的原因。我将查看UseInstance和RegisterInstance之间的区别,并查看是否有任何突出的问题。延迟始终在Prism INavigationService.NavigateAsync中,但是当使用Unity导航到同一表单时第二次几乎没有延迟,因此我已经排除了ViewModelLocator服务。 - Martin Robins
RegisterInstance已被弃用,DryIoc现在推荐使用UseInstance。您是否正在使用任何导航接口(IConfirmNavigationINavigationAware等)?您在其中编写的任何代码可能是实际减慢速度的原因。 - Dan Siegel
@DanS。是的,我确实使用了IConfirmNavigation和INavigationAware以及INavigationService。不过,正如我所说,如果我使用Unity,第一次导航会很慢(可能需要几秒钟),但随后的导航会更快(小于一秒),而使用DryIoc时,所有导航都很慢(虽然不像使用Unity时第一次导航那么慢)。我曾希望切换到DryIoc可以解决初始延迟问题,因为基准测试表明它可能会解决这个问题,但并没有指望每次解析对象时都会有延迟。 - Martin Robins
1
如果不知道您的应用程序具体在做什么,很难说是什么原因导致了这种行为。如果想要发布一个可以复制该行为的示例,我很乐意查看。否则,您可以在Prism Slack频道上联系我,我可以私下查看您的问题。 - Dan Siegel
显示剩余2条评论
2个回答

2

感谢您的帮助。现在一切都正常工作了(请查看我的答案),但我将完成对DryIoc的转换,并且将研究使用UseInstance代替RegisterInstance - 我会告诉您我取得的进展。 - Martin Robins
很高兴问题已经解决,期待您以任何形式的反馈。 - dadhi

1
我看到的问题与IoC容器无关,而是由于Visual Studio 15.2更新引入了Xamarin的问题。安装最新的更新(15.2.26430.12)并重新构建解决方案可以恢复我所期望的性能水平。

1
每个人都说Unity很慢,DryIoc是最好的选择。我正在使用Unity,我的XF应用程序在启动画面后需要几秒钟才能运行。你说DryIoc实际上并不能改善事情,尽管我看到了所有基准测试。你最终使用了什么? - Don Box

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接