Как правильно моделировать точку расширения, которая должна иметь только одну активную реализацию? - PullRequest
0 голосов
/ 21 марта 2012

У меня есть приложение RCP, которое использует точки расширения для определения различных подключаемых функциональных битов.

В некоторых случаях у меня есть точка расширения, которая может логически иметь много активных реализаций одновременно: скажем, точка DataFeed, и приложение может поддерживать многие из них.

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

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

Хотя это не совсем правильно, и мне интересно, есть ли альтернативный подход, который я еще не использовал для моделирования этого типа поведения. У кого-нибудь есть способы сделать это, чтобы чувствовать себя лучше?

1 Ответ

2 голосов
/ 22 марта 2012

В вашем решении ответственность за принятие решения о том, является ли расширение активным или нет, возлагается на поставщиков расширений (фабрики).Независимо от реальной логики выбора активного расширения (в любой данный момент) я бы сказал, что было бы лучше иметь элемент управления в поставщике расширения point , то есть в классе, который делает вызовыфабрики.Это связано с тем, что поставщики расширений не знают друг о друге (или не должны знать).

На самом деле это довольно распространенная ситуация в Eclipse, и ее обычно разрешают, когда расширения определяют дополнительные атрибуты для обработчика точки расширения, чтобы решитькакое расширение должно быть активным в зависимости от состояния рабочей среды (см., например, enabledWhen атрибут org.eclipse.ui.handlers точка расширения) или предпочтения пользователя.

...