Это довольно стандартная установка, клиент WinForms> Самообслуживаемый уровень Business / Data> SQL Server (хранимые процедуры).
На данный момент мой вызов WinForms для получения данных будет выглядеть примерно так:
MyData = RecipientInfo.GetListings(<options>)
. Затем он заполнит пользовательский интерфейс указанными данными, в основном через Binding, поскольку все объекты поддерживают такие вещи, как BindingList и INotifyPropertyChanged.
Функция GetListings()
делает две вещи. Сначала он получает список данных для поиска, затем, как только эта структура будет заполнена из DataReader, другая функция отключится и сделает больше доступа к базе данных, вызвав метод статических GetOtherRelatedStuff(<stuffId>)
других объектов. Затем он будет отсортирован и сгруппирован позже.
Я полагаю, что мой вопрос на самом деле больше относится к вкусу, но вот очевидные варианты, если я хочу обработать свой SQL (DataReaders и т.п., чтобы заполнить мои объекты вручную), а затем выполнить некоторый базовый анализ данных, пока пользователь ждет.
- Сделайте так, чтобы мой начальный механизм доступа к данным использовал шаблон IAsyncResult, моя WinForm будет ожидать обратного вызова
- Используйте функцию SqlCommands
BeginExecuteReader()
и обратный вызов, когда будете готовы. Это не поможет моему вызывающему коду, поэтому мне придется подключить процедуру двойного обратного вызова, чтобы сообщить клиенту WinForms о завершении работы
- События? Вероятно, нет.
- BackgroundWorker? Это хорошо, и я использовал это с большим успехом и раньше, но он действительно немного ориентирован на пользовательский интерфейс (что действительно является смыслом этого упражнения).
- Использовать задачи из расширений Parallel в моем коде вызова WinForms. Я предполагаю, что мой реальный код уровня данных для работы с SQL будет написан синхронно, как обычно, и WinForm просто позаботится о его запуске и обработке пользовательского интерфейса после его завершения.
Фактически, я также могу использовать внутренние помощники, такие как AsParallel, чтобы помочь с дополнительными методами получения данных и группированием / сортировкой данных после завершения работы SQL.
Задачи также значительно упрощают модульное тестирование, поскольку мой код доступа к данным написан так, что его легко выполнить.
Что-нибудь, что я пропустил?