当前位置:  开发笔记 > 编程语言 > 正文

使用Adobe AIR构建插件体系结构

如何解决《使用AdobeAIR构建插件体系结构》经验,为你挑选了2个好方法。

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

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

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

我想在AIR中完成同样的事情(从本地文件系统加载插件,而不是从Web加载).阅读本文之后,我的理解是,它是可能的,并且基本架构(将SWF加载到沙盒ApplicationDomains等中)与您在.NET中的方式非常相似.

但我对这些陷阱感到好奇.

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

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


以下是一些仍未解决的具体问题:

1)actionscript"Loader"类可以将SWF加载到ApplicationDomain中.但该appdomain究竟包含什么?模块?类?MXML组件是如何表示的?如何找到实现我的插件界面的所有类?

2)如果您已将插件从主应用程序加载到单独的ApplicationDomain中,从其他应用程序域调用代码是否更加复杂?关于可以通过app -main域间编组层的数据类型是否有任何重要的限制?编组是否过于昂贵?

3)理想情况下,我想将自己的大部分主代码作为插件开发(主应用程序只是一个插件加载shell)并使用插件架构将该功能提升到应用程序中.这会让你内心感到害怕吗?



1> Luca Tettama..:

    applicationDomain更像是命名空间,它将类定义分组并将它们放入层次结构中:域可以直接访问其自己的域或父域中的符号,但不能访问子域或兄弟域中的符号(或更好:它可以'直接这样做 - 它必须通过applicationDomain对象,询问给定类的定义); 加载外部swf时,您可以决定将新符号放在何处:子域(默认),附加到系统的新域(使用null),当前域,附加在其他位置的域(显式传递父域的父域)新域名).请注意,新符号永远不会覆盖当前域中的符号,但多个域中可能存在相同的名称.
    不幸的是你不能枚举给定域中的类(好吧,至少我不知道有什么方法可以做到),但常见的解决方案是要求(如"插件接口"中)知名的存在每个swf中的工厂,它将返回插件的定义(Class)或插件本身.

    你只是以某种方式(工厂)得到对象的引用,然后它只是另一个对象.没有编组:域只是命名空间的逻辑分区(它是系统域的树分支).

    没有:)但是要注意:它可能很容易变成GC的地狱,由于引用在其他域中传播,因此无法卸载未使用的域.我建议看看多核PureMVC框架,可能还有管道,以确保插件之间的严格分离.

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



2> hasseg..:

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

我已经使用ModuleManager类(以及mx.modules包中的其他内容)为Flex应用程序实现了一个简单的插件API .它的要点是您从主机应用程序中继承插件ModuleBase并使用ModuleManager它们来加载它们.然后你让插件实现一个通用接口(例如IMyAppPlugin)并使用某种外观来表示和实现插件可以使用的主机应用程序的接口(例如)MyAppFacade implements IMyAppFacade.每当加载插件时,将这个外观引用注入它们.

Flex 3帮助中的"模块化应用程序概述"主题有一些很好的信息(子模块"模块域"在模块的上下文中讨论了应用程序域.)这是一段摘录:

"默认情况下,模块会加载到当前应用程序域的子域中.您可以使用ModuleLoader类的applicationDomain属性指定其他应用程序域."

主题"使用ApplicationDomain类"进入应用领域的主题更深入,你一定要读它,如果你还没有准备好.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有