#c_sharp #mvvm #prism
В классе BindableBase есть 2 перегрузки метода bool SetPropetry(ref T storage, T value, string propertyName = null); bool SetPropetry (ref T storage, T value, Action onChanged, string propertyName = null); Не вижу в чем смысл данной перегрузки? Если это перегрузка для того что бы к примеру повесить callback на сторонний View или ViewModel, то в чем смысл передавать Action , если мне необходимо сослаться к примеру на ссылку какого то объекта текущей ViewModel, или передать данные для валидации Model? Простейшие перегрузки методов которые мне необходимы: protected virtual bool SetProperty (ref T storage, T value, Action onChanged, T2 obj, [CallerMemberName] string propertyName = null) { if (!SetProperty(ref storage, value)) return false; onChanged.Invoke(obj); return true; } protected virtual bool SetProperty (ref T storage, T value, Action onChanged, ref T2 obj, [CallerMemberName] string propertyName = null) { if (!SetProperty(ref storage, value)) return false; onChanged.Invoke(obj); return true; } Q: Почему возник такой вопрос? A: До этого пользовался исключительно Catel, в котором изначально было описана одна реализация установки значений полям, и оповещении подписчиков. P.S. Я знаю что могу самостоятельно сделать свою перегрузку в которую запихну этот самый Action , Но я все же не понимаю зачем было так делать?
Ответы
Ответ 1
Смотрите, никаких проблем я тут не вижу. Проблемы в том, чтобы «засунуть» дополнительные параметры в Action, нет: вы просто делаете замыкание по нужным параметрам (например, () => ProcessOnPropertySet(this)). А вот на стороне фреймворка проблемы есть, потому что непонятно, какие именно параметры вам нужно передать. Вы хотите весь объект? Вы хотите новое значение свойства? Вы хотите проверить и возможно изменить значение свойства? Вы хотите отправить событие? Всё это можно легко выразить через Action при помощи замыкания. А если мы хотим избавиться от замыкания, то фреймворку нужно заранее угадать, какие параметры вам понадобятся. И самостоятельно определить нужную вам перегрузку. А это не так просто, потому что у каждого проекта свои, специфические требования. Поэтому универсальное решение с Action вполне катит.Ответ 2
Данный вопрос следует задавать разработчикам Prism, но никак не в этом комьюнити. Не бывает идеальных API, которые бы устраивали всех. Тем не менее, это явно не худший пример, так как у тебя остаётся возможность реализовать собственную обёртку и передать менее общий делегат. Можно взглянуть на классический подход WindowsForms-приложений, в которых коллбеки строго ограничены сигнатурой (Object sender, EventArgs args). Легко найти такие варианты использования, в которых передаётся this, null, 'new EventArgs()' и т.д. И люди точно так же задаются вопросом - зачем так было делать? Prism наследует принципы .NET Framework и предоставляет минимально достаточный API, который программисты могут расширять для своих нужд. В данном случае такая возможность есть.
Комментариев нет:
Отправить комментарий