【发布时间】:2010-09-25 13:46:43
【问题描述】:
我正在考虑选择 Adobe AIR 作为即将到来的项目的客户端实施技术。 (之前的选择是 C# 和 WPF,但最近对 Flash/Flex/AIR 印象深刻。)
但我的产品最重要的功能之一是它的插件架构,它允许第三方开发人员以有趣的方式扩展功能和 GUI。
我知道如何在 C# 中设计架构:插件加载器会枚举本地“app/plugins/”目录中的所有程序集。对于每个程序集,它会枚举所有类,寻找“IPluginFactory”接口的实现。对于工厂创建的每个插件,我都会询问它的 MVC 类,并将其 GUI 元素(菜单项、面板等)嵌入现有 GUI 布局中的适当插槽中。
我想在 AIR 中完成同样的事情(从本地文件系统加载插件,而不是从 Web 加载)。在阅读this article 之后,我的理解是这是可能的,并且基本架构(将 SWF 加载到沙盒应用程序域等)与您在 .NET 中的方式非常相似。
但我很好奇其中的陷阱。
如果你们中的任何人使用 Flash 播放器进行了任何动态类加载(最好是在混合的 flash/flex 应用程序中,特别是在 AIR 主机中),我很想听听您构建插件框架的经验以及您在哪里运行使用 flash 播放器、flash、flex 和 AIR API 处理棘手的情况。
例如,如果有人问我同样的问题,但考虑到 Java 平台,我肯定会提到 JVM 没有“模块”或“程序集”的概念。最高级别的聚合是“类”,因此很难在插件系统中创建组织结构来管理大型项目。我还将讨论多个类加载器的问题,以及每个类加载器如何维护自己独立的加载类实例(具有自己独立的静态变量)。
以下是一些对我来说仍未得到解答的具体问题:
1) 动作脚本“Loader”类可以将 SWF 加载到 ApplicationDomain。但是那个 appdomain 到底包含什么?模块?上课? MXML 组件是如何表示的?如何找到所有实现我的插件接口的类?
2) 如果您已将插件加载到与主应用程序不同的 ApplicationDomain 中,那么从该其他应用程序域中调用代码是否会更加复杂?对于可以通过跨应用程序域编组层的数据类型是否有任何重要限制?编组是否过于昂贵?
3) 理想情况下,我想将自己的大部分主代码开发为插件(主应用程序只不过是一个插件加载外壳),并使用插件架构将该功能提升到应用程序中.是不是让你心生恐惧?
【问题讨论】:
标签: flash air flex3 dynamic-loading plugin-architecture