如何管理具有特定生命周期的实例
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);
我有两个屏幕需要管理项目列表。用户可以从第一个屏幕导航到第二个屏幕。
当用户从第一个屏幕返回时,项目列表需要保存到商店。
我正在考虑的方式是使用一个服务来保存注入到视图模型中的集合。 但是一旦用户从第一个屏幕导航回来,就必须释放服务实例:
// 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);