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