代码之家  ›  专栏  ›  技术社区  ›  benjismith

使用AdobeAIR构建插件体系结构

  •  16
  • benjismith  · 技术社区  · 16 年前

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

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

    this article ,我的理解是这是可能的,并且基本架构(将SWF加载到沙盒应用程序域等)与您在.NET中的方式非常相似。

    但我对哥特夫妇很好奇。

    如果你们中有人使用flash player进行过动态类加载(最好是在flash/flex混合应用程序中,尤其是在AIR主机中),我很想听听您构建插件框架的经验,以及您在使用flash player以及flash、flex和AIR API时遇到的棘手情况。


    这里有几个具体问题我还没有回答:

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

    2) 如果您已将插件从主应用程序加载到一个单独的ApplicationDomain中,那么从另一个appdomain中调用代码是否会更加复杂?对于可以通过appdomain间封送层的数据类型是否有任何重要限制?编组是否昂贵得令人望而却步?

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

    4 回复  |  直到 16 年前
        1
  •  6
  •   Luca Tettamanti    16 年前
    1. applicationDomain更像一个名称空间,它将类定义分组并将它们放入层次结构中:域可以直接访问其自己域或父域中的符号,但 在子域或同级域中(或者更好:它不能直接这样做-它必须通过applicationDomain对象,询问给定类的定义);加载外部swf时,您可以决定 要放置新符号:子域(默认)、附加到系统的新域(使用null),则 现在的
      不幸的是,您无法枚举给定域中的类(好吧,至少我不知道任何方法),但常见的解决方案是要求(在“插件接口”中)每个swf中都有一个已知的工厂,它将返回插件的定义(类)或插件本身。
    2. 否:)但请注意:它可能很容易变成GC的地狱,因为引用散布在其他域中,所以无法卸载未使用的域。我建议看一看多核PureMVC框架,可能有管道来确保插件之间的严格分离。

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

        2
  •  5
  •   hasseg    16 年前

    我已经使用 ModuleManager mx.modules 它的要点是,您可以从 ModuleBase 和使用 模块管理器 IMyAppPlugin facade 表示并实现插件可以使用的主机应用程序接口(例如。 MyAppFacade implements IMyAppFacade )加载插件时,将此外观引用注入插件。

    话题 "Modular applications overview" 在Flex 3帮助中有一些很好的信息(分章 “模块域” 在模块的上下文中讨论应用程序域。)以下是摘录:

    应用程序域。您可以指定 通过使用不同的应用程序域 的applicationDomain属性

    话题 "Using the ApplicationDomain class"

        3
  •  0
  •   CT CT    15 年前

    您是否尝试过加载子应用程序?
    有很好的文档可以在空中完成这项工作,我在几个小时内就成功了。但是,由于子应用程序和主应用程序之间的沙箱冲突,Flex中的同一个实现是不同的。我花了几个星期的时间把头撞到墙上。

        4
  •  0
  •   C8H10N4O2    7 年前

    回应关于Java是一种可能的插件体系结构的声明:

    我不得不插一句,因为尽管Java在这方面被定位为一个非常弱的选择,但它实际上比迄今为止的任何其他语言/运行时环境在提供此类工作系统方面都要成功得多——特别是vs.C#.NET,它当然具有良好的模块固有功能。这有点讽刺,但你明白了。

    至于AdobeAIR,我正在管理一个项目,这个项目正在AIR上设计。在我们的例子中,我们的模块扩展性总是从web服务器传递,而不是从本地目录传递。Flex具有

    <mx:Module/>

    遗憾的是,AIR的一个令人沮丧之处在于它缺乏任何用于启动其他应用程序的类api。您可以加载URL以在用户的默认浏览器中加载内容,但不能启动Excel。Java和C#都有API,用于作为外部进程启动其他应用程序。

    推荐文章