现在我正在使用MVVM Light来实现MVVM模式。所以在我看来,我创建了多个选项卡并将它们绑定到一个ViewModel的多个实例。我通过以下方式实现这一目标:
ServiceLocator.Current.GetInstance<ViewModel>(key);
当我这样做时,ViewModel的每个实例都连接到ViewModelLocator中注册的同一个DataService实例:
SimpleIoc.Default.Register<IDataService, DataService>();
但是我希望Viewmodel的每个实例都有一个Dataservice实例。为什么?因为ViewModel的每个实例都具有相同的功能,但需要其他数据。
如何为新的ViewModel实例创建MVVM,为ViewModelLocator创建一个新的DataService实例?这是否可能或不是MVVM模式中的一种好方法,而我无法正确理解DataService?
答案 0 :(得分:1)
您可以使用Register
方法的重载版本来创建数据服务的多个实例。
SimpleIoc.Default.Register<IDataService>(()=>new DataService(),"viewmodel1");
SimpleIoc.Default.Register<IDataService>(()=>new DataService(),"viewmodel2");
答案 1 :(得分:1)
以上所有答案对我也不起作用,因此我对其进行了一些重新调整。
您正常注册数据服务实例:
SimpleIoc.Default.Register<IDataService, DataService>();
然后,通过注册ViewModel实例以直接在ViewModel的构造函数中获取数据服务的新实例(而不是缓存的实例)来插入工厂方法:
SimpleIoc.Default.Register<ViewModel>(() => new ViewModel(SimpleIoc.Default.GetInstanceWithoutCaching<IDataService>()));
答案 2 :(得分:0)
SimpleIoc将返回the same cached instance,如果您希望每次调用都有一个新的实例,请使用Register方法重载之一:
public void Register<TClass>(Func<TClass> factory) where TClass : class{}
所以,在你的情况下将是
SimpleIoc.Default.Register<IDataService>(() => new DataService());
编辑 - 你是对的,可能this answer会引导你朝着正确的方向前进。我建议您使用功能齐全的IOC容器(我已成功使用 Autofac 和 SimpleIoc ),以便正确分配生活方式。