2015-07-08 10 views
0

прямо сейчас Я использую MVVM Light для создания шаблона MVVM. Поэтому, на мой взгляд, я создаю несколько вкладок и привязываю их к нескольким экземплярам одного ViewModel. Я достигнуть этого с:MVVM Light создает несколько экземпляров DataService

ServiceLocator.Current.GetInstance<ViewModel>(key); 

Когда я делаю это, каждый экземпляр ViewModel подключен к тому же один экземпляр DataService зарегистрирован в ViewModelLocator:

SimpleIoc.Default.Register<IDataService, DataService>(); 

Но я хочу, чтобы иметь для каждого экземпляра Viewmodel также один экземпляр Dataservice. Зачем? Поскольку каждый экземпляр ViewModel имеет ту же функцию, но требует других данных.

Как создать в MVVM Lights ViewModelLocator новый экземпляр DataService, когда для нового экземпляра ViewModel? Является ли это возможным или не является хорошим подходом к шаблону MVVM, и я неправильно понял DataService?

ответ

0

SimpleIoc вернется the same cached instance, если вы хотите новый свежий экземпляр при каждом вызове, используйте один из методов перегрузок Регистрации:

public void Register<TClass>(Func<TClass> factory) where TClass : class{} 

Таким образом, в вашем случае будет что-то вроде

SimpleIoc.Default.Register<IDataService>(() => new DataService()); 

EDIT- Вы правы, вероятно, this answer проведет вас в правильном направлении. Я бы рекомендовал использовать полнофункциональный контейнер IOC (я использовал Autofac и SimpleIoc с успехом), где образ жизни может быть правильно назначен.

+0

Спасибо за ваш ответ, но это не работает для меня. Конструктор класса DataService вызывается только один раз. Вызов метода Register вне статического конструктора ViewModelLocator вызывает исключение System.InvalidOperationException. –

+0

@SebastianRichter, пожалуйста, уточните мое обновление –

+0

Спасибо за подсказку с Autofac. Слишком плохо, что он не работает в MVVM Light. –

1

Вы можете использовать перегруженную версию метода Register для создания нескольких экземпляров службы данных.

SimpleIoc.Default.Register<IDataService>(()=>new DataService(),"viewmodel1"); 
SimpleIoc.Default.Register<IDataService>(()=>new DataService(),"viewmodel2"); 
+0

Вы уверены? Вы проверили это? Потому что я получаю исключение: Тип не найден в кеше без ключа: QueuedOxyplot.Model.IDataService –

 Смежные вопросы

  • Нет связанных вопросов^_^