Я потратил некоторое время на то, чтобы внимательно прочитать ваши требования, и отметил некоторые мысли, которые можно предложить в качестве звучащей доски.
Во-первых, для повторяющихся задач с обычным поведением это, безусловно, подход к нему.Вы не одиноки в размышлениях об этой проблеме.
Люди, делающие кучу подобных вещей, возможно, создали подобные абстракции, однако, насколько мне известно, ни одна не была опубликована публично.
Как далеко высогласиться с этим может зависеть от того, хотите ли вы, чтобы это было только для вашего собственного использования и для тех, у кого очень похожие требования, или если вы хотите рассмотреть более общие случаи и сделать продукт, который будет использоваться очень широкой аудиторией.
Я собираюсь предположить первое, но это не исключает возможности выпустить его как проект с открытым исходным кодом, который можно развивать дальше и / или разветвлять.
Не пытаясь удовлетворить все возможности, которые выможет сделать определенные предположения о характере используемой реализации и, в частности, о выборе дизайна пользовательского интерфейса.
Я думаю, что в целом ваше мышление идет в правильном направлении.Читая некоторые ваши мысли высокого уровня, я подумал, что некоторые вещи можно упростить (что хорошо) и в то же время обеспечить привлекательный пользовательский интерфейс.
По вашим начальным точкам.
- Вы можете просто предположить, что производительность передается через индикатор выполнения.
- Сделайте это, если это важно для вас, но вы могли бы столкнуться с некоторой сложностью, связанной с различными требованиями к кешированию - изменением длительности или грязной обработкой.Возможно, этого достаточно, чтобы опираться на платформы, встроенные в кеширование URL-адресов (которые, как обнаружили некоторые люди, мешают им).
- Обработка сетевого подключения, да, это повторяющееся и несколько запутанное.Идеальный кандидат для общего решения.
- Обновление пользовательского интерфейса ... возможно, лучше просто возвращать данные и откладывать решения относительно представления и формата данных для ваших индивидуальных клиентов.
- Содержимое в основной памяти -см. выше о кешировании.
О ваших потенциальных входах.
- Где отобразить контент - см. выше данные и отложите выбор представления для клиента.
- Я бы выбрал элемент пользовательского интерфейса для индикатора прогресса, опять же индикатор производительности.Что касается сообщения об ошибке, я хотел бы рассмотреть возможность реализации этого в событии Completed, которое вы публикуете.Затем с помощью параметров вы можете передать результат и отложить обработку клиенту, чтобы поместить этот результат в некоторый элемент управления представлением / журнал / что угодно.Это согласуется с шаблонами, используемыми .Net Framework.
- URI - да, это передается.
- Как выполнить синтаксический анализ - передача делегата для преобразования потока или строки в объектчей тип может быть определен клиентом, имеет смысл.
- Loc of cache - вы можете пропустить это, если обобщите это, или жестко закодировать его путь.Это было бы более полезно для других, если передать (рассмотрим, если вы обрабатываете папки / создание).
О реализации.
- Вы можете пойти с UserControl, еслиэто работает для вас, чтобы быть связанным этим предположением.Хотя было бы более гибким и, возможно, столь же простым / элегантным, отодвинуть презентацию на клиенте как для отображения данных, так и для сообщений о состоянии, а также для управления скрытием / отображением индикатора выполнения, как передано.
- Возможно, выможет пойти дальше, если предположить, что сообщения о состоянии всегда будут отображаться в текстовом блоке (если они пройдены) и перенести эту служебную работу с каждого из ваших клиентов в ваш общий класс.
- Я подозреваю, что вам не поможет соединениеФормат данных и представление все еще.
- Обработка захоронения. Я бы рекомендовал провести здесь тестирование на платформах со встроенным кэшированием URL-адресов и посмотреть, сможете ли вы определить, подходят ли его длительности / грязные условия для ваших общих случаев.
Надеюсь, это даст вам некоторые соображения и определенную уверенность, что вы идете по правильному пути.Есть много способов сделать это.Какой путь в конечном итоге будет зависеть от ваших целей.