如何管理具有特定生命周期的实例

时间:2016-10-20 21:45:28

标签: xamarin.forms unity-container prism

我有两个需要管理项目列表的屏幕。用户可以从第一个屏幕导航到第二个屏幕。

当用户从第一个屏幕导航回来时,需要将项目列表保存到商店。

我正在考虑使用一种服务来保存集合,并将其注入到视图模型中。 但是,一旦用户从第一个屏幕导航回来,就必须释放服务实例:

docker build -t swift3-ssh .  
docker run -p 2222:22 -i -t swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

但这看起来很尴尬,必须有更好的方法来做到这一点......

我看到有一个// 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上调用GC.Collect以确保GC收集服务的实例,并且OnDisappearing将在下次需要在{{1}中注入时重新创建它}。但是调用ExternallyControlledLifetimeManager似乎也错了......

2 个答案:

答案 0 :(得分:1)

根据您的评论,听起来您应该通过导航参数将数据传递给您的观点。然后每个页面可以不同地处理参数。保持简单。

var p = new NavigationParameters();
p.Add("items", MyListOfItems);
_regionManager.RequestNavigate("MyView", p);

答案 1 :(得分:0)

将您的Service放入另一项服务中,该服务的职责是提供Service的当前实例。

interface IServiceProvider
{
    Service CurrentInstance { get; set; }
}

然后将此作为单身(ContainerControlledLifetimeManager)注册,并在两个视图模型中使用它。第一个将实例设置为新实例,很可能由某些IServiceFactory创建,第二个实例用实例填充实例。