Должны ли вы вернуть перевязку с бизнес -уровня (или сервисного уровня, доменной модели и т. Д.)?
-
11-10-2019 - |
Вопрос
Мне нужен привязый список в моем пользовательском интерфейсе, чтобы обеспечить двустороннюю базу данных между моей коллекцией и DataGridView. Тем не менее, не кажется правильным возвращать перевязку от вашего бизнес -уровня (или доменного уровня, уровня обслуживания, уровня данных и т. Д.). То есть я буду использовать только связующий список из -за требования пользовательского интерфейса, и теперь эта потребность в пользовательском интерфейсе будет сочетаться с моим доменным слоем.
Какой «правильный» способ сделать это? Должен ли я возвращать илиста, а затем копировать его в связывание связывания в целях презентации? С точки зрения реального мира, стоит ли эта накладная головка?
Решение
Я думаю, что доменная слой вернет более общие типы и уведомляет ли они (ObservableCollection<>
) или нет (IEnumerable<>
или же IList<>
) соответствует требованиям.
Уровень пользовательского интерфейса может иметь дело с их трансформированием, как они хотят (или нет) в iBindingList, если им нужна эта функциональность.
Мы использовали BindableLinq к большому успеху для достижения целей уведомления/синхронизированного списка связывания (возможно, с фильтрами) на уровне пользовательского интерфейса.
Другие советы
Там нет копирования илиста (по крайней мере, я надеюсь, что вы действительно не хотите создавать копию/клон). Все, что вы обычно делаете, это создаете еще одну ссылку на один и тот же объект ILIST. Таким образом, возвращение илистского объекта - нет ничего плохого.
Вы можете вернуть, например, объект списка и обратиться к нему из списка для привязки (который находится в вашем пользовательском интерфейсе).
По моему мнению, лучше вернуть объект ILIST (List, Hashtable ASO), чем привязый список, поскольку вы можете использовать первый в разных интерфейсах (консоль, сеть, победа, сервис). Например, использование связующего списка не будет иметь никакого преимущества в веб -приложении.
Я не знаю, что такое «правильный» способ, но я использовал рамки, такие как CSLA в прошлом, и я знаю, что он использовал связывание связывания, а теперь и наблюдение за списками бизнеса. Это сделало с использованием бизнес -объектов в пользовательском интерфейсе очень простым, поскольку пользовательский интерфейс обновляется, когда элементы были добавлены или удалены из списков. Если вы вернете ILIST, а затем скопируете его в привязку, вам необходимо вручную отслеживать и обрабатывать изменения в ILIST и перевести их в переплет. Мое личное предпочтение состоит в том, чтобы иметь богатый бизнес -слой, когда это было возможно, который будет использовать перевязанный список или наблюдение, чтобы представить бизнес -уровень в пользовательский интерфейс.
Если вы хотите, чтобы элементы пользовательского интерфейса редактировали бизнес -модель, не внедряя свои собственные обработчики событий, бизнес -модель должна иметь обязательный список.
В любое время, когда вы делаете что -то вроде new BindingList<MyWidget>( list )
Вы отделяете привязку из корневого списка. Если предмет отредактирован, все будет работать нормально, но дополнения и удаления не будут отражены в исходном списке.
Я недавно попытался реализовать что -то подобное, вступив в SintingList ListChanged
Событие, которое обновило мою модель, чтобы отразить изменения связывания списка, но если модель была изменена контроллером, она не обновляла список привязки в пользовательском интерфейсе.
Вы можете создать специальные аксессов в свои списки, которые поднимают события каждый раз, когда вы добавляете или удаляете элементы из списка, но это просто повторно изобретает колесо BindingList с большим количеством накладных расходов.