Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 使用AdobeAIR构建插件体系结构_Flash_Air_Flex3_Dynamic Loading_Plugin Architecture - Fatal编程技术网

Flash 使用AdobeAIR构建插件体系结构

Flash 使用AdobeAIR构建插件体系结构,flash,air,flex3,dynamic-loading,plugin-architecture,Flash,Air,Flex3,Dynamic Loading,Plugin Architecture,我正在考虑选择AdobeAIR作为即将到来的项目的客户端实现技术。(之前的选择是C#和WPF,但我最近对Flash/Flex/AIR印象深刻。) 但我的产品最重要的特性之一是其插件架构,允许第三方开发人员以有趣的方式扩展功能和GUI 我知道如何在C#中设计体系结构:插件加载程序将枚举本地“app/plugins/”目录中的所有程序集。对于每个程序集,它将枚举所有类,查找“IPluginFactory”接口的实现。对于工厂创建的每个插件,我会要求它提供MVC类,并将其GUI元素(菜单项、面板等)捕

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

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

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

我希望在AIR中完成同样的事情(从本地文件系统加载插件,而不是从web加载插件)。阅读后,我的理解是这是可能的,并且基本架构(将SWF加载到沙盒应用程序域等)与您在.NET中的操作方式非常相似

但我对哥特夫妇很好奇

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

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


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

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

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

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

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

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

    Luca Tettamanti已经对您的具体问题给出了很好的答案,所以我只提供一些关于一般主题的附加信息:

    我已经使用类(以及包中的其他东西)为Flex应用程序实现了一个简单的插件API。其要点是,您可以从
    ModuleBase
    中对插件进行子类化,并在宿主应用程序中使用
    ModuleManager
    加载它们。然后让插件实现一个公共接口(例如
    IMyAppPlugin
    )并使用某种类型的a来表示和实现插件可以使用的主机应用程序接口(例如,
    MyAppFacade实现IMyAppFacade
    ),每当加载插件时,将此facade引用注入其中

    Flex 3帮助中的主题有一些很好的信息(分章“模块域”讨论了模块上下文中的应用程序域)

    默认情况下,模块加载到当前模块的子域中 应用程序域。您可以指定 通过使用不同的应用程序域 的applicationDomain属性 ModuleLoader类。“

    本主题更深入地讨论了应用程序域的主题,如果您还没有读过,您一定要阅读。

    Respondin