Я также лично не против Dispatcher
в модельных классах.Я не видел каких-либо серьезных проблем с ним, но он дает большую гибкость вашему коду.
Но мне нравится идея инкапсулировать использование Dispatcher
в коде инфраструктуры в максимально возможной степени.Как и в случае с методом RaisePropertyChanged
(кстати, в случае RaisePropertyChanged
вам не нужно ничего отправлять - привязка уже делает это за вас; вам нужно только отправить изменения в коллекции).
Самый большой и единственный недостаток, который я вижу здесь, это юнит-тестирование.Когда вы пытаетесь проверить свою логику, которая использует Dispatcher
, все может быть сложно.Представьте, что у вас есть что-то подобное в модели представления:
private void UpdateMyCollection()
{
IList<ModelData> dataItems = DataService.GetItems();
// Update data on UI
Dispatcher.BeginInvoke(new Action(() => {
foreach (ModelData dataItem in dataItems)
{
MyObservableCollection.Add(new DataItemViewModel(dataItem));
}
}));
}
Этот тип кода довольно типичен для обновления коллекций из потока, не являющегося пользовательским интерфейсом.Теперь, как бы вы написали модульный тест, который проверяет логику добавления элементов в наблюдаемую коллекцию?Прежде всего, вам нужно будет смоделировать свойство Dispatcher
, поскольку Application.Current
равно null
во время выполнения модульного теста.Во-вторых, как ты будешь издеваться?Будете ли вы создавать специальный поток, который будет имитировать поток пользовательского интерфейса и использовать Dispatcher
этого потока?Итак, такого рода вещи.
Суть в том, что если вы хотите, чтобы ваш код был дружественным к юнит-тестам, вам нужно подумать о том, как вы будете издеваться над Dispatcher
.Это единственная проблема.
Обновление:
Второй предоставленный вами пример БУДЕТ работать без Dispatcher
(связывание поможет).