gpt4 book ai didi

mvvm - 是否有处置的TransientLifetimeManager

转载 作者:行者123 更新时间:2023-12-03 10:24:24 25 4
gpt4 key购买 nike

我有一个具有相应ViewModel的WPF View 。所有实例都通过一个统一的容器解决。因为我使用的是 Prism ,所以需要两个独立的 View 实例,以将其添加到 View 注册到的两个不同区域中。如果我尝试将一个实例添加到两个区域中,则会得到一个

InvalidOperationException: Specified element is already the logical child of another element. Disconnect it first.



当 View 已添加到第二区域时,因为它已经添加到第一区域。

使用始终返回新实例的TransientLifetimeManager可以轻松解决此问题,因此两个区域都将填充一个独立的实例。

但是我们决定在新用户登录时创建一个子容器。使用此子容器解析与 session 相关的每个 View 和 View 模型。当用户的 session 结束时,将放置子容器,以便也放置与 session 相关的每个实例。但是,使用TransientLifetimeManager时,统一容器无法处理这些实例。

我们需要的是一个生存期管理器,该管理器始终返回一个新实例,但也能够处置这些实例。周围已经有这样的终身经理吗?还是有其他方法可以实现我上面描述的内容?

最佳答案

您想要的听起来像是ContainerControlledLifetime管理器的一个变体,它不维护单个实例,而是一个实例的集合。不幸的是,这不是内置的生命周期管理器之一。

您可以查看code for the ContainerControlledLifetimeManager并发现它非常简单。您的“SynchronizedGetValue”实现将始终返回null(向需要实例化新实例的容器发送信号)。您可以将ContainerControlledLifetimeManager子类化,然后重写该方法。

我已经写好了。我想我可以给你代码。 :)

public class ContainerTrackedTransientLifetimeManager :     
ContainerControlledLifetimeManager
{
protected override object SynchronizedGetValue()
{
return null;
}
}

那应该工作。我尚未测试过……从界面上看,它似乎是为1对1的LifetimeManager与对象的关系而设计的,但是如果事实证明它还不止于此,则您可能必须重写SetValue(添加到集合中)对象)和处理(处理对象集合)。这是该实现:
public class ContainerTrackedTransientLifetimeManager : 
SynchronizedLifetimeManager, IDisposable
{
private ConcurrentCollection<object> values = new ConcurrentCollection<object>();

protected override object SynchronizedGetValue()
{
return null;
}

protected override void SynchronizedSetValue(object newValue)
{
values.Add(newValue);
}

public override void RemoveValue()
{
Dispose();
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected void Dispose(bool disposing)
{

var disposables = values.OfType<IDisposable>();
foreach(var disposable in disposables)
{
disposable.Dispose();
}
values.Clear();
}

我不确定哪个是正确的答案。让我知道您的情况如何。

关于mvvm - 是否有处置的TransientLifetimeManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com