Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Control Flow осуществляет ViewModel, поэтому и модальные диалоги ей вызывать. Это если паттерн MVVM
class Foo{
@inject("bar")
bar;
}
public class ViewModelFactory : IViewModelFactory
{
private readonly IEventAggregator _aggregator;
private readonly IProgress _progress;
private readonly IPromptCreator _promptCreator;
public ViewModelFactory(IEventAggregator aggregator, IProgress progress, IPromptCreator promptCreator)
{
_aggregator = aggregator;
_progress = progress;
_promptCreator = promptCreator;
}
public ViewModel CreateViewModel(IPaymentSystem paymentSystem, IRulesValidator rulesValidator)
=> new ViewModel(_aggregator, _progress, _promptCreator, paymentSystem, rulesValidator);
}
Какой бардак! Слишком много шума в декларации конструктора.
Не нужны вам конкретно? У меня они в каждой VM.
Если у вас такая специфика приложений, это не значит, что у других такая же.
Что касается подковёрного мусора: есть более конкретное описание того в чём проблема предложенной модификации и возможные пути решения?
Итак, у вас есть зависимости, которые не нравятся вам самому.
По моему мнению лучший способ сделать зависимость явной — сделать ее параметром конструктора.
А в чем специфика? Вам досталось такое легаси, это явное требование заказчика, это навязано каким-нибудь фреймворком? По-настоящему безнадежен только второй вариант.
1) Модальные диалоги — по возможности выпилить совсем как наихудшую разновидность фриза. Там, где выпилить не удается, оставить зависимость в конструкторе — такая часть Control Flow должна быть явной.
2) Агрегатор событий можно заменить на конкретные источники событий, они скажут гораздо больше, чем агрегатор, который сам по себе является разновидностью Service Locator со всеми его проблемами.
3) Прогресс — если это не подразумевает фриз, то реализовать как отдельный стек MVVM, т.е. длительные задачи, неважно кем инициированные, публикуются отдельной моделью, над которой есть свои ViewModel и View для отображения прогресса. Ваша ViewModel должна только вызвать метод собственной модели. Если же нужен именно фриз, можно сделать это частью интерфейса сервиса модальных диалогов.
Что значит не нравятся, откуда вы это взяли?
В статье идёт речь как раз о том, что утилитарные зависимости бессмысленно вытаскивать в конструктор, поскольку ничего они для чтения хорошего не несут. Никто на нашем проекте ни разу не ощутил боли от того, что мы вынесли их из конструктора.
Специфика в том, что есть куча операций, длительность которых невозможно заранее рассчитать (с устройствами мы работаем очень много, которые никаких нотификаций о прогрессе не поддерживают). И есть куча модальных диалогов, просто потому что они нужны в ПО, не понимаю, что здесь объяснять… они вызваны необходимостью запрашивать подтверждения действий у пользователя.
Святая корова, зачем так сложно? Плодить чего-то там, если можно всего этого не делать?
так как в самом очевидном месте всех необходимых зависимостей нет. Уж поверьте, я был бы крайне огорчен, пропустив любую из этих зависимостей, например, при рефакторинге. До вашей переделки это было бы невозможно.
Мало того, теперь после конструирования получается неполноценный объект: ему еще надо инициализировать свойства. А как вишенка на торт в класс добавлены атрибуты, дающие жесткую привязку к MEF.
Если нет нотификаций о прогрессе как таковых, то как вы его отображаете?
Кучи модальных диалогов не нужны, как и подтверждения действий пользователя. Смотрите хоть у Купера, хоть у Раскина. Подтверждения объективно требуют только необратимые операции (фарш невозможно провернуть назад). И если такого у вас много, то это весьма специфический проект.
Не вижу ничего сложного. Мои ViewModel оказываются проще ваших
Всё равно придётся прописывать ImportingConstructor и другие атрибуты специфичные для MEF. Как от этого избавляться? Отгораживать полностью MEF?
Intederminate Progress Bar. Чтобы пользователь понимал, что приложение не зависло наглухо и не дать затыкать UI.
Это стабильные зависимости и в ближайшие годы они никуда не уедут и наблюдать их в конструкторе никому в нашем проекте не интересно,
Именно так, у нас специфичный проект. Вообще я зачастую акцентирую внимание на том, что не надо выдвигать догмы, мне нравится Марк Симан, но считаю его объективным недостатком — догматизм.
За счёт чего? Куча лишних классов лучше одного, с помощью которого можно показывать прогресс бар?
Куча лишних классов лучше одного, с помощью которого можно показывать прогресс бар?
Скрытые зависимости как «запах» проектирования