Шаблон альтернативных событий MVVM - PullRequest
0 голосов
/ 11 августа 2011

В настоящее время у меня есть иерархия, которая выглядит следующим образом

MainWindowViewModel
    TabViewModel
        EditorViewModel
            ReviewingServices
                ConflictFinder

Проблема, с которой я сталкиваюсь, заключается в том, что TabViewModel хочет получать уведомления о конфликтах (от ReviewingServices), а также о других вещах.,Я мог бы создавать публичные геттеры для всех моих зависимостей и подписываться на все, что я хочу с DependencyA.DependencyB.DependencyC += SomeHandler;, но это довольно грязно.Я обнаружил, что создаю слишком много событий, которые я хочу считать.По сути, я создал грязную сеть событий.Мне нравится разделение обязанностей, которое я создал для каждого класса, но когда в каждом классе по 2-3 мероприятия, поддерживать его довольно сложно.У меня нет проблем с созданием и ведением событий, если подписчик только на 1 уровень выше.Беспорядок возникает, когда, скажем, MainWindowViewModel желает получать уведомления о новых обзорах (опубликовано с ReviewingServies.

. Есть ли лучший способ делать такие события, когда подписчик может захотеть подписаться на события, которые глубоковложено в приложение?

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Попробуйте использовать Microsoft Prism и их агрегатор событий

1 голос
/ 11 августа 2011

Цепочка DependencyA.DependencyB.DependencyC обычно считается нарушением Закона Деметры (вы фактически полагаетесь на зависимость от зависимости и т. Д.).

Недавно я решил похожую проблему проектирования,используя Mediator , определяемый интерфейсом, таким как IMyOperationNameContext, который позволял мне совместно использовать / внедрять объединенный контекст двух моделей ViewModel с элементом управления WinForms, который использует третью модель ViewModel, и все это без соединениямоделируются напрямую.

Примерно так (обратите внимание, что в примере IAlbumContext действует больше как прокси, но это только потому, что образец упрощен):

interface IAlbumContext
{
    public AlbumInfo SelectedAlbum { get; set; }
}

class AlbumContext
{
    AlbumSelectionViewModel _model;

    public AlbumContext(AlbumSelectionViewModel model)
    {
        _model = model;
    }     

    public Album SelectedAlbum {
        get { return _model.Album; }
    }
}

class PhotoUploadDialog : Dialog
{
    public PhotoUploadDialog(IAlbumContext context, PhotoUploadViewModel viewModel)
    {
    }
}

Хотя этоРешение сработало для меня, и мне нравится, что оно с высокой степенью сплоченности и развязано, в конечном итоге оно не масштабируемо (например, количество таких контекстных интерфейсов может быстро расти в зависимости от приложения).Однако с более общим решением компромисс заключается в том, что код становится сложнее следовать.

1 голос
/ 11 августа 2011

Не знаю, действительно ли у меня возникли проблемы, но я предлагаю взглянуть на какой-нибудь агрегатор событий.Попробуйте проверить Caliburn one , но не так уж отличается, чтобы реализовать его самостоятельно.При этом вы называете событие типом и подписываетесь на него отовсюду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...