Сценарий таков ...
Основное приложение поддерживает ряд параллельных задач, каждая из которых может быть длительной, и может потребоваться захватить ввод данных пользователем в любое время (захватить фокус).
Известные / поддерживаемые задачи будут предоставлены плагинами.
В настоящее время я предполагаю что-то вроде:
Приложение предоставляет: SearchWeb
и MonitorServer
, которые реализуют ITask
(эффективно в качестве тезисов)
Пользователь выбирает MonitorServer
, что приводит к созданию нового экземпляра MonitorServer
, хорошо, мы вызовем MS1
. Они пинают другого, которого мы назовем MS2
Теперь ... по причинам пользовательского интерфейса, только одна активная задача может быть "сфокусирована" - подобно нескольким открытым окнам, только одно может быть сверху.
Итак ... Что мне нужно, так это чтобы плагины представляли, какие задачи они поддерживают, а также, когда пользователь выбирает определенную задачу, для создания конкретного объекта и отслеживания его состояния. Кроме того, мне нужен плагин, чтобы иметь возможность открывать окна, о которых знает главное приложение ... Например, я могу выдать «Закрыть все окна» из основного интерфейса.
Я знаю, как использовать отражение для сканирования всех сборок, которые реализуют данный интерфейс (ITask
), и я могу загрузить все это в отдельном домене приложения, чтобы я мог перезагрузить плагины, если что-то умирает (Кто-нибудь знает о есть ли какая-либо причина не иметь домен приложения для конкретной задачи? Это позволит любой отдельной задаче умереть без ущерба для остальных)
Ничего не стоит, хотя в настоящее время все плагины предоставлены нами, мы ожидаем, что в будущем появится сторонняя организация, поэтому я должен убедиться, что она обрабатывает грубые / плохо написанные плагины.
Справочная информация: у меня есть Unity, создающая деревья объектов, поэтому создание экземпляров не является проблемой - это больше вопрос о том, как зарегистрировать возможности.
Должно ITask
быть:
Sub RegisterTasks(Container as IContainerWrapper)
(который будет вызываться каждый раз при повторной инициализации контейнера)
или возможно:
Property SupportedTasks As IEnmerable(Of System.Type)
или что-то еще целиком?
Я могу получить метаданные (имя задачи, описание, уникальный ключ) из атрибутов ITask
Спасибо за ваш вклад.