Как правило, слой модели представления должен иметь отношение 1: 1 к вашему виду, не должно быть веских оснований для существования функции «Сохранить» в модели представления, которая затем вызывается другой моделью представления.
То, что вы должны делать, это помещать эту логику в службу, т.е. что-то вроде этого:
public interface ISerializationService
{
void Save(SomeData data);
}
Затем вам нужна реализация для этой службы, которая выполняет реальную работу:
public class SerializationService : ISerializationService
{
void Save(SomeData data)
{
// actual save happens here
}
}
Ваши модели представлений должны содержать свойства, указывающие на экземпляры этих служб:
public class MyViewModel : ViewModelBase
{
[Inject]
public ISerializationService SerializationService { get; set; }
// called when the user clicks a button or something
private void ButtonClickCommand()
{
this.SerializationService.Save(this.SomeData);
}
}
Остается только один вопрос: «Что задает значение SerializationService?», И для этого вам нуженструктура внедрения зависимости.Существует множество других возможностей, MVVMLight устанавливает их сам, но Ninject является стандартом де-факто.При правильной реализации среда внедрения создаст для вас все модели представлений, а затем «внедрит» зависимости, т. Е. Ваше свойство SerializationService
типа ISerializationService
будет инициализировано экземпляром вашего класса SerializationService
(который вслучай, подобный этому, также будет настроен как одноэлементный).
Внедрение зависимостей требует немного усилий, чтобы разобраться, но как только вы начнете использовать его, вы никогда не оглядываетесь назад.Это облегчает полное разделение проблем, избавляя от необходимости передавать указатели на все по всей вашей архитектурной иерархии.