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

How to manage an instance with a specific lifetime

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

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

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

// 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 将在下次需要将其注入 [=17= 时重新创建它].但是调用 GC.Collect 似乎也是错误的...

将您的 Service 放在另一个服务中,该服务的工作是提供 Service 的当前实例。

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

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

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

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