【发布时间】:2017-03-03 01:58:56
【问题描述】:
我有两个屏幕需要管理项目列表。用户可以从第一个屏幕导航到第二个屏幕。
当用户从第一个屏幕返回时,需要将项目列表保存到商店。
我想这样做的方式是让一个服务持有该集合,该集合被注入到视图模型中。 但是一旦用户从第一个屏幕导航回来,就必须释放服务实例:
// somewhere, maybe in Application:
LifetimeManager = new ContainerControlledLifetimeManager();
Container.RegisterType<Service>(lifetimeManager);
class FirstPage()
{
ContainerControlledLifetimeManager _lifetimeManager;
public FirstPage()
{
InitializeComponent();
}
void OnDisappearing()
{
LifetimeManager.RemoveValue();
}
}
但这似乎很尴尬,必须有更好的方法来做到这一点......
我看到有一个ExternallyControlledLifetimeManager,这似乎是我需要的,但它仍然需要FirstPage 实例来获取管理器的实例并调用RemoveValue。或者,我会在OnDisappearing 上调用GC.Collect 以确保GC 收集服务实例,并且ExternallyControlledLifetimeManager 将在下次需要注入FirstPageViewModel 时重新创建它。但是调用GC.Collect 似乎也错了......
【问题讨论】:
-
您尝试使用服务的方式毫无意义。为什么导航到视图时需要相同的服务,但导航返回时需要不同?我认为您需要重新考虑服务的功能。
-
感谢您的评论。第一个屏幕在内存中创建第二个屏幕也需要使用的项目列表。一旦用户从第一个屏幕导航回来,列表必须存储在存储库中。我认为该服务是在屏幕视图模型之间共享列表的好方法,但我不知道它应该与 DI 一起使用的正确方式。不确定,但我认为该列表就像第一个视图模型创建的会话,然后它也必须由第二个视图模型使用。
-
不是服务,而是在两个屏幕视图模型之间共享一个子视图模型实例更好吗?但是我仍然不知道如何使用 DI 来做到这一点。
-
或者可能只在屏幕上共享一个大视图模型?
标签: xamarin.forms unity-container prism