Я собираюсь выбрать Adobe AIR в качестве технологии реализации на стороне клиента для предстоящего проекта. (Предыдущий выбор был С# и WPF, но в последнее время меня впечатлило Flash/Flex/AIR.)
Но одной из самых важных функций моего продукта будет его плагиновая архитектура, позволяющая сторонним разработчикам расширять функциональность и графический интерфейс интересными способами.
Я знаю, как бы я проектировал архитектуру в С#: загрузчик плагинов перечислил бы все сборки в локальном каталоге "app/plugins/". Для каждой сборки он будет перечислять все классы, ища реализации интерфейса "IPluginFactory". Для каждого плагина, созданного factory, я бы попросил его для своих классов MVC и привязать его элементы GUI (пункты меню, панели и т.д.) К соответствующим слотам в существующем макете графического интерфейса.
Я хотел бы сделать то же самое в AIR (загрузка плагинов из локальной файловой системы, а не из Интернета). После прочтения этой статьи, я понимаю, что это возможно, и что базовая архитектура (загрузка SWF в песочницу ApplicationDomains и т.д.) Очень похожа на вы бы сделали это в .NET.
Но мне любопытно узнать, что произошло.
Если кто-либо из вас выполнил любую динамическую загрузку классов с помощью флеш-плеера (желательно в смешанных флеш-флеш-приложениях и ESPECIALLY внутри хоста AIR), мне бы хотелось услышать о ваших впечатлениях о создании вашей плагиновой структуры и о том, в сложные ситуации с флэш-плеером, а также с флеш-флемом и API-интерфейсом AIR.
Например, если кто-то спросил меня об этом же вопросе, но с учетом платформы Java, я бы определенно упомянул, что JVM не имеет понятия о "модулях" или "сборках". Самый высокий уровень агрегирования - это "класс", поэтому создавать организационные структуры в рамках плагиновой системы для управления крупными проектами может быть сложно. Я также расскажу о проблемах с несколькими загрузчиками классов и о том, как каждый из них поддерживает свой отдельный экземпляр загруженного класса (с его собственными отдельными статическими варами).
Вот несколько конкретных вопросов, которые по-прежнему остаются без ответа:
1) Класс ActionScript "Loader" может загрузить SWF в ApplicationDomain. Но что именно содержит этот апдомен? Модули? Классы? Как представлены компоненты MXML? Как найти все классы, реализующие мой интерфейс плагина?
2) Если вы загрузили плагин в отдельный ApplicationDomain из основного приложения, значительно сложнее ли вызывать код из этого другого приложения? Существуют ли какие-либо важные ограничения в отношении видов данных, которые могут проходить через слой междоменного маршаллинга? Является ли сортировка чрезмерно дорогостоящей?
3) В идеале, я бы хотел разработать большинство своего собственного основного кода в качестве плагина (с основным приложением, являющимся чуть больше, чем оболочкой для загрузки плагинов) и использовать архитектуру плагина, чтобы поднять эту функциональность в приложении, Это страх в вашем сердце?