flash - 使用 Adob​​e AIR 构建插件架构

标签 flash air flex3 dynamic-loading plugin-architecture

我正在考虑选择 Adob​​e AIR 作为即将到来的项目的客户端实现技术。 (之前的选择是 C# 和 WPF,但最近我对 Flash/Flex/AIR 印象深刻。)

但我的产品最重要的特性之一将是它的插件架构,它允许第三方开发人员以有趣的方式扩展功能和 GUI。

我知道如何在 C# 中设计架构:插件加载器将枚举本地“app/plugins/”目录中的所有程序集。对于每个程序集,它会枚举所有类,寻找“IPluginFactory”接口(interface)的实现。对于工厂创建的每个插件,我会询问它的 MVC 类,并将其 GUI 元素(菜单项、面板等)插入现有 GUI 布局中的适当插槽中。

我想在 AIR 中完成同样的事情(从本地文件系统加载插件,而不是从网络加载插件)。看完this article ,我的理解是这是可能的,并且基本架构(将 SWF 加载到沙盒应用程序域等)与您在 .NET 中执行的方式非常相似。

但我对这些问题很好奇。

如果你们中的任何人使用 flash 播放器进行了任何动态类加载(最好在混合 flash/flex 应用程序中,特别是在 AIR 主机中),我很想听听您构建插件框架的经验以及遇到棘手情况的地方使用 flash 播放器,以及使用 flash、flex 和 AIR API。

例如,如果有人问我同样的问题,但考虑到 Java 平台,我肯定会提到 JVM 没有“模块”或“程序集”的概念。最高级别的聚合是“类”,因此很难在插件系统中创建组织结构来管理大型项目。我还将讨论多个类加载器的问题,以及每个类加载器如何维护自己的加载类的单独实例(具有自己的单独静态变量)。

以下是一些对我来说仍然没有答案的具体问题:

1) ActionScript “Loader”类可以将 SWF 加载到 ApplicationDomain。但是那个 appdomain 到底包含什么?模块?上课? MXML 组件是如何表示的?如何找到所有实现我的插件接口(interface)的类?

2)如果您已将插件加载到与主应用程序不同的 ApplicationDomain 中,那么从该其他应用程序域中调用代码是否会更加复杂?对于可以通过跨应用程序域编码层的数据类型是否有任何重要限制?编码是不是非常昂贵?

3) 理想情况下,我想将我自己的大部分主代码开发为插件(主应用程序只不过是一个插件加载外壳),并使用插件架构将该功能提升到应用程序中。是不是让你心里产生了恐惧?

最佳答案

  • applicationDomain 更像一个命名空间,它将类定义分组并放入层次结构中:一个域可以直接访问自己域或父域中的符号,但是 不是 在子域或兄弟域中(或者更好:它不能直接这样做——它必须通过 applicationDomain 对象,询问给定类的定义);加载外部 swf 时,您可以决定将新符号放在哪里:子域(默认)、附加到系统的新域(使用 null)、当前域、附加到其他地方的域(显式传递新域)。请注意,新符号永远不会覆盖当前域中的符号,但同名可以存在于多个域中。
    不幸的是,您无法枚举给定域中的类(好吧,至少我不知道有什么办法),但常见的解决方案是要求(如“插件接口(interface)”中)存在一个众所周知的每个 swf 中的工厂,它将返回插件的定义(类)或插件本身。
  • 您只需以某种方式(工厂)获取对该对象的引用,然后它只是另一个对象。没有编码:域它只是命名空间的逻辑分区(它是系统域的树分支)。
  • 不 :) 但请注意:它可能很容易变成 GC 的 hell ,由于引用散布在其他域中,无法卸载未使用的域。我建议看一下多核 PureMVC 框架,可能带有用于确保插件之间严格分离的管道。

  • 顺便说一句,Flash Player 也是一个安全域的概念,但我实际上从未接触过它,所以我不知道这里有什么可能性。

    关于flash - 使用 Adob​​e AIR 构建插件架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/344705/

    相关文章:

    flash - 闪光灯无法通过开放式 socket 连接,存在安全问题

    android - 如何让我的 AIR (flash as3) 应用程序在 Android 上全屏显示?

    apache-flex - 将 '1.4348907E22' 转换为 '14348907000000000000000' 的 Flex 代码

    flex3 - 如何在 Flex/Flash ColumnChart 中的 ColumnSeries 之间添加空间?

    javascript - 哪个 swfobject.js 文件?

    javascript - 通过颜色框内的 AS3 外部接口(interface)调用 javascript

    flash - 如何在运行某些代码之前等待 flash (as2) 加载子元素?

    android - 使用 flex builder 为 android 安装 AIR 应用程序时发生错误

    apache-flex - As3 Graph API 注销

    apache-flex - 禁用 google chrome (Mac) 中的缓存以在 flex/flash 中进行开发