【问题标题】:How to manage an instance with a specific lifetime如何管理具有特定生命周期的实例
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的评论。我根据布莱恩的评论更新了我的问题。在您的示例中,我不清楚它如何确保服务与第一个屏幕一样长。
  • 服务提供者注册为单例,因此与应用程序一样存在,因此它保持服务实例处于活动状态,只要它被分配给它。根据您的需要,您可以在替换实例时将其处理掉,或者将其留作垃圾回收。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多