Лучший способ зарегистрировать возможности плагина с родительским приложением - PullRequest
1 голос
/ 03 января 2012

Сценарий таков ...

Основное приложение поддерживает ряд параллельных задач, каждая из которых может быть длительной, и может потребоваться захватить ввод данных пользователем в любое время (захватить фокус).

Известные / поддерживаемые задачи будут предоставлены плагинами.

В настоящее время я предполагаю что-то вроде:

Приложение предоставляет: SearchWeb и MonitorServer, которые реализуют ITask (эффективно в качестве тезисов) Пользователь выбирает MonitorServer, что приводит к созданию нового экземпляра MonitorServer, хорошо, мы вызовем MS1. Они пинают другого, которого мы назовем MS2

Теперь ... по причинам пользовательского интерфейса, только одна активная задача может быть "сфокусирована" - подобно нескольким открытым окнам, только одно может быть сверху.

Итак ... Что мне нужно, так это чтобы плагины представляли, какие задачи они поддерживают, а также, когда пользователь выбирает определенную задачу, для создания конкретного объекта и отслеживания его состояния. Кроме того, мне нужен плагин, чтобы иметь возможность открывать окна, о которых знает главное приложение ... Например, я могу выдать «Закрыть все окна» из основного интерфейса.

Я знаю, как использовать отражение для сканирования всех сборок, которые реализуют данный интерфейс (ITask), и я могу загрузить все это в отдельном домене приложения, чтобы я мог перезагрузить плагины, если что-то умирает (Кто-нибудь знает о есть ли какая-либо причина не иметь домен приложения для конкретной задачи? Это позволит любой отдельной задаче умереть без ущерба для остальных)

Ничего не стоит, хотя в настоящее время все плагины предоставлены нами, мы ожидаем, что в будущем появится сторонняя организация, поэтому я должен убедиться, что она обрабатывает грубые / плохо написанные плагины.

Справочная информация: у меня есть Unity, создающая деревья объектов, поэтому создание экземпляров не является проблемой - это больше вопрос о том, как зарегистрировать возможности.

Должно ITask быть:

Sub RegisterTasks(Container as IContainerWrapper)

(который будет вызываться каждый раз при повторной инициализации контейнера) или возможно:

Property SupportedTasks As IEnmerable(Of System.Type)

или что-то еще целиком?

Я могу получить метаданные (имя задачи, описание, уникальный ключ) из атрибутов ITask

Спасибо за ваш вклад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...