Flash 使用AdobeAIR构建插件体系结构
我正在考虑选择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没有“模块”或“程序集”的概念。聚合的最高级别是“类”,因此很难在插件系统中创建用于管理大型项目的组织结构。我还将讨论多个类加载器的问题,以及每个类加载器如何维护自己加载的类的单独实例(使用自己单独的静态变量)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元素(菜单项、面板等)捕
这里有几个具体问题我还没有回答: 1) actionscript“Loader”类可以将SWF加载到ApplicationDomain中。但是appdomain到底包含什么呢?模块?上课?MXML组件是如何表示的?如何找到实现插件接口的所有类 2) 如果您已将插件从主应用程序加载到一个单独的ApplicationDomain中,那么从另一个appdomain中调用代码是否会更加复杂?对于可以通过appdomain间封送层的数据类型是否有任何重要限制?编组是否昂贵得令人望而却步 3) 理想情况下,我希望将我自己的大部分主代码开发为一个插件(主应用程序只不过是一个插件加载外壳),并使用插件架构将该功能提升到应用程序中。这会让你内心感到恐惧吗
不幸的是,您无法枚举给定域中的类(好吧,至少我不知道任何方法),但常见的解决方案是要求(在“插件接口”中)每个swf中都有一个已知的工厂,它将返回插件的定义(类)或插件本身
顺便说一句,Flash Player也是安全域的一个概念,但实际上我从未接触过它,所以我不知道这里有什么可能性。Luca Tettamanti已经对您的具体问题给出了很好的答案,所以我只提供一些关于一般主题的附加信息: 我已经使用类(以及包中的其他东西)为Flex应用程序实现了一个简单的插件API。其要点是,您可以从
ModuleBase
中对插件进行子类化,并在宿主应用程序中使用ModuleManager
加载它们。然后让插件实现一个公共接口(例如IMyAppPlugin
)并使用某种类型的a来表示和实现插件可以使用的主机应用程序接口(例如,MyAppFacade实现IMyAppFacade
),每当加载插件时,将此facade引用注入其中
Flex 3帮助中的主题有一些很好的信息(分章“模块域”讨论了模块上下文中的应用程序域)
默认情况下,模块加载到当前模块的子域中
应用程序域。您可以指定
通过使用不同的应用程序域
的applicationDomain属性
ModuleLoader类。“
本主题更深入地讨论了应用程序域的主题,如果您还没有读过,您一定要阅读。Respondin