Связь между viewModels с использованием интерфейсов в манере MVVM - PullRequest
0 голосов
/ 18 февраля 2019

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

public interface ISelectProject
{
    event EventHandler<SelectedProjectEventArgs> MessageReceived;
    void ProjectSelected(...);       
}

public class SelectProject : ISelectProject
{
    public event EventHandler<SelectedProjectEventArgs> MessageReceived;
    public void ProjectSelected(..)
    {
        MessageReceived?.Invoke(this,new SelectedProjectEventArgs(...));
    }
}

После этого я внедряю класс SelectProject вэто дерево ViewModels с использованием конструктора инъекций (код не показан здесь).Затем в ViewModelA я вызываю событие MessageReceived, и все другие модели ViewModel подписываются на событие.

public class ViewModelA : ViewModelBase
{
    public ViewModelA(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.ProjectSelected;
    }
}

public class ViewModelB : ViewModelBase
{
    public ViewModelB(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}

public class ViewModelC : ViewModelBase
{
    public ViewModelC(ISelectProject selectProject)
    {
        _selectProject = selectProject;
        _selectProject.MessageReceived += (s, data) =>
        {
            ...
        };
    }
}

Мои вопросы:

1) Это как-то нарушает практику MVVM?

2) Считается ли хорошей практикой такое взаимодействие между ViewModels?

3) Вносит ли это решение какие-либо риски, например, утечки памяти и т. Д.?

Спасибо!

1 Ответ

0 голосов
/ 18 февраля 2019

1) Это как-то нарушает практику MVVM?

Нет.ISelectedProject - это, по сути, общий сервис.Общая служба - это класс, который предоставляет функциональные возможности нескольким компонентам в отсоединенном виде.Пожалуйста, обратитесь к этой ссылке для получения дополнительной информации и примера.

2) Считается ли хорошей практикой общаться между viewModels, как это?

Да, если вы хотите отсоединить их друг от друга.

3) Вносит ли это решение какие-либо риски, например утечки памяти и т. Д.

ИспользованиеСлужба общего доступа сама по себе не вызывает утечек памяти.Но если ваша общая служба предоставляет событие, и модель представления подписывается на него, не отписываясь от него, служба будет поддерживать модель представления.

...