Gor*_*ran 19 mvvm mvvm-light silverlight-5.0 c#-4.0
据我所知,SimpleIoc使用GetInstance方法来检索已注册的类的实例.如果实例不存在,它将创建它.但是,此实例被缓存并始终检索,这模仿单例模式.
我的想法是,如果这个ViewModel需要两次的可能性很小,就没有必要在内存中保留ViewModel的实例,所以我想在每次需要时创建它的新实例.如果我们有一个ViewModel工厂,我们将拥有这样的属性:
public MyViewMOdel MyViewModel
{
get { return SimpleIoc.Default.GetInstance<MyViewModel>(); }
}
Run Code Online (Sandbox Code Playgroud)
这个使用单例模式,我认为在所有情况下都不是最佳实践.为了避免这个问题,我这样做:
public MyViewModel MyViewModel
{
get { return new MyViewModel(SimpleIoc.Default.GetInstance<ISomeInterface>()); }
}
Run Code Online (Sandbox Code Playgroud)
这个有一个缺点,如果我更改了MyViewModel的构造函数,我还需要更新此属性.没什么大不了的,但仍有某种依赖性.
你如何处理这种情况,我有什么遗漏?以及为什么决定不返回非共享实例.
另一个问题是,在MVVM Deep dive会话中,Laurent在注册特定的ViewModel之后立即使用GetInstance方法,正如他所说的那样,确保容器中已存在此ViewModel的实例.为什么这有必要?如果您通过ViewModelLocator获取ViewModel,那么您将在需要时创建它.那么我为什么要提前创建它们呢?
您可以通过将不同的密钥传递给GetInstance方法来每次获取不同的实例.但是,实例将被缓存,因此如果您不想将它们保留在缓存中,则需要使用相应的密钥调用Unregister.
在演示中,我提前创建了VM,因为MainVM正在向SecondaryVM发送消息.由于Messenger的注册是在SecondaryVm的构造函数中完成的,因此需要先创建它才能开始接收消息.Messenger很棒,因为它非常分离,但是在这些情况下,您需要做额外的工作来补偿解耦:即使MainVM没有得到任何引用,SecondaryVM也是消息的目标.
希望它有意义.干杯,洛朗