Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.forms 表单:为什么导航服务不是单例的?_Xamarin.forms_Prism - Fatal编程技术网

Xamarin.forms 表单:为什么导航服务不是单例的?

Xamarin.forms 表单:为什么导航服务不是单例的?,xamarin.forms,prism,Xamarin.forms,Prism,您好,当我查看PrismApplicationBase的实现时,我发现了以下代码 /// <summary> /// Registers all types that are required by Prism to function with the container. /// </summary> /// <param name="containerRegistry"></param> protecte

您好,当我查看
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);
    }
//
///注册Prism在容器中运行所需的所有类型。
/// 
/// 
受保护的虚拟无效注册表RequiredTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance(_containerExtension);
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.Register(NavigationServiceName);
}
我们可以看到导航服务的最后一次注册是而不是singleton

所以我的两个问题是:

  • 为什么INavigationService的注册与其他服务不同
  • 为什么我们要为它指定一个名称(即
    NavigationServiceName

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

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

    如果您查看,您会注意到
    PageNavigationService
    没有自己的状态,因此不需要将其设置为单例


    通常情况下,人们会尽可能少地单身。它们会带来开销、无法死亡(比如故意内存泄漏)并使事情变得复杂。

    第二段没有意义。导航目标的命名与导航服务的命名有什么关系?我不明白,为什么成为singleton会阻止服务导航到viewmodel?如果它没有自己的状态,那么它在哪里保存页面堆栈?如果您看到GoBackInternal的代码,它使用
    PageUtility
    ,我认为这就是跟踪页面的原因。。。无论如何,关于性能和内存泄漏,我真的没有被说服,因为其余的服务都注册为singleton。那些其他的服务有一个状态,需要是singleton。但是仅仅通过使用其中一个单例,你不会成为你自己的单例。相反,如果某个单例为你管理你的状态,你自己也不需要成为单例。页面堆栈呢?这不是一种状态吗?当然,这是一种状态,但该状态由
    应用程序提供程序管理,而不是由
    页面导航服务管理。
    ApplicationProvider
    是一个单身汉……好吧,很高兴知道,我正在写一篇文章,我能和你联系吗?我想向你展示一个关于导航(和单身)的问题,也许你可以帮助我,这样我可以修改这个问题,你可以找到这个问题,有没有办法与你分享屏幕?这不会超过15分钟