Prism.Forms:为什么navigationService不是单例?

时间:2019-02-13 14:03:30

标签: xamarin.forms prism

您好,当我查看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);
    }

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

所以我的两个问题是:

  1. 为什么INavigationService的注册不像其他服务那样单身?
  2. 我们为什么要为其指定一个名称(即NavigationServiceName

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果您查看source code,您会发现PageNavigationService没有自己的状态,因此不需要 将其设为单例

通常,人们会尝试使单身人士越少越好。它们会带来开销,无法消亡(造成故意的内存泄漏)并使事情复杂化。