gpt4 book ai didi

c#-4.0 - SimpleIoc - 它可以在每次需要时提供新实例吗?

转载 作者:行者123 更新时间:2023-12-02 10:29:57 26 4
gpt4 key购买 nike

据我了解,SimpleIoc 使用 GetInstance 方法来检索已注册的类的实例。如果实例不存在,它将创建它。但是,该实例会被缓存并始终被检索,这模仿了单例模式。

我的想法是,如果这个 ViewModel 被需要两次的可能性很小,那么就没有必要在内存中保留 ViewModel 的实例,所以我想在每次需要时创建它的新实例。如果我们有一个 ViewModel 工厂,我们将有一个像这样的属性:

public MyViewMOdel MyViewModel
{
get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}

这个使用单例模式,我认为这并不是在所有情况下都是最佳实践。为了避免这个问题,我这样做:

public MyViewModel MyViewModel
{
get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}

这个有一个缺点,如果我更改 MyViewModel 的构造函数,我也需要更新此属性。没什么大不了的,但仍然存在某种依赖性。

你如何处理这种情况,我有什么遗漏的吗?以及为什么决定不返回非共享实例。

另一个问题是,在 MVVM 深度潜水 session 中,Laurent 在注册特定 ViewModel 后立即使用 GetInstance 方法,以便如他所说,确保容器中已经存在此 ViewModel 的实例。为什么这是必要的?如果您通过 ViewModelLocator 获取 ViewModel,那么您将在需要时创建它。那么为什么我要预先创建它们呢?

最佳答案

通过将不同的键传递给 GetInstance 方法,您可以每次获取不同的实例。但是实例将被缓存,因此如果您不想将它们保留在缓存中,则需要使用相应的 key 调用 Unregister。

在演示中,我预先创建了 VM,因为 MainVM 正在向 secondaryVM 发送消息。由于 Messenger 的注册是在 secondaryVm 的构造函数中完成的,因此需要先创建它,然后才能开始接收消息。 Messenger 很棒,因为它非常解耦,但在其中一种情况下,您需要做额外的工作来补偿解耦:SecondaryVM 是消息的目标,即使 MainVM 没有获得任何对它的引用。

希望这是有道理的。干杯,洛朗

关于c#-4.0 - SimpleIoc - 它可以在每次需要时提供新实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9342294/

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