【问题标题】:Prism.Forms: Why navigationService is not singleton?Prism.Forms:为什么 navigationService 不是单例的?
【发布时间】:2019-07-07 09:31:08
【问题描述】:

您好,当我查看PrismApplicationBase 的实现时,我发现了以下代码

    /// <summary>
    /// Registers all types that are required by Prism to function with the container.
    /// </summary>
    /// <param name="containerRegistry"></param>
    protected virtual void RegisterRequiredTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IContainerExtension>(_containerExtension);
        containerRegistry.RegisterSingleton<ILoggerFacade, EmptyLogger>();
        containerRegistry.RegisterSingleton<IApplicationProvider, ApplicationProvider>();
        containerRegistry.RegisterSingleton<IApplicationStore, ApplicationStore>();
        containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>();
        containerRegistry.RegisterSingleton<IDependencyService, DependencyService>();
        containerRegistry.RegisterSingleton<IPageDialogService, PageDialogService>();
        containerRegistry.RegisterSingleton<IDeviceService, DeviceService>();
        containerRegistry.RegisterSingleton<IPageBehaviorFactory, PageBehaviorFactory>();
        containerRegistry.RegisterSingleton<IModuleCatalog, ModuleCatalog>();
        containerRegistry.RegisterSingleton<IModuleManager, ModuleManager>();
        containerRegistry.RegisterSingleton<IModuleInitializer, ModuleInitializer>();
        containerRegistry.Register<INavigationService, PageNavigationService>(NavigationServiceName);
    }

我们可以看到导航服务的最后一次注册是NOT单例的。

所以我的两个问题是:

  1. 为什么INavigationService 的注册不像其他服务那样单例?
  2. 为什么要给它命名(即NavigationServiceName

【问题讨论】:

    标签: xamarin.forms prism


    【解决方案1】:

    首先,在 Prism 应用程序中导航在概念上与 Xamarin.Forms 中的标准导航不同。虽然 Xamarin.Forms 导航依赖于 Page 类实例进行导航,但 Prism 删除了对 Page 类型的所有依赖项,以从 ViewModel 中实现松散耦合的导航。在Prism中,导航到View或者导航到ViewModel的概念是不存在的,所以INavigationService不是单例的。

    导航到体验或唯一标识符,它表示您希望在应用程序中导航到的目标视图。所以你需要为它命名。

    【讨论】:

    • 第二段没有意义。导航目标的命名与导航服务的命名有什么关系?
    • 我不明白,为什么单身会阻止服务导航到视图模型?
    【解决方案2】:

    如果您查看source code,您会注意到PageNavigationService 没有自己的状态,因此没有需要使其成为单例。

    通常情况下,我们会尽量减少单例。它们引入了开销,不会死(有点像故意的内存泄漏)并使事情复杂化。

    【讨论】:

    • 如果它没有自己的状态,那么它将页面堆栈保存在哪里?如果您看到 GoBackInternal 的代码,它使用 PageUtility 并且我认为这是跟踪页面的原因......无论如何,关于性能和内存泄漏,我真的不相信,因为其余的服务都注册为单例。
    • 那些其他服务有状态,需要是单例的。但是仅仅通过使用其中一个单例,你并不会成为你自己的单例。相反,如果某个单例为你管理你的状态,你不需要自己成为单例。
    • 页面堆栈怎么样?那不是一种状态吗?
    • 当然,这是一个状态,但该状态由ApplicationProvider 管理,而不是PageNavigationService。而ApplicationProvider 一个单身...
    • 好的,很高兴知道,我正在写一篇文章,我可以得到你的联系方式吗?我想向您展示我在导航(和单身)方面遇到的问题,也许您可​​以帮助我,以便我可以修改问题并且您可以找到问题,有没有办法与您共享屏幕?不会超过 15 分钟
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2014-08-10
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多