但是,我的产品最重要的功能之一就是其插件架构,允许第三方开发人员以有趣的方式扩展功能和GUI。
我知道我如何在C#中设计架构:插件加载程序将枚举本地“app / plugins /”目录中的所有程序集。对于每个程序集,它将枚举所有类,查找“IPluginFactory”接口的实现。对于由工厂创建的每个插件,我会要求它的MVC类,并将其GUI元素(菜单项,面板等)捕捉到现有GUI布局中的相应插槽中。
我想在AIR中完成同样的事情(从本地文件系统加载插件,而不是从网络加载插件)。阅读this article后,我的理解是可能的,基本架构(将SWF加载到沙盒ApplicationDomains等)与您在.NET中的方式非常相似。
但是我很好奇,
如果您有任何人使用Flash播放器进行任何动态类加载(最好是混合的Flash / Flex应用程序,并且在AIR主机中是非常好的),我很乐意听到您构建插件框架的经验,以及遇到棘手的情况与Flash播放器,以及闪存,Flex和AIR API。
例如,如果有人问我这个同样的问题,但是考虑到Java平台,我肯定会提到JVM没有“模块”或“程序集”的概念。最高级别的聚合是“类”,因此在管理大型项目的插件系统中创建组织结构可能很困难。我还会讨论多个类加载器的问题,以及每个维护自己独立的加载类的实例(使用其自己的单独的静态vars)。
这里有几个具体问题仍然没有得到我的回答:
1)动作脚本“Loader”类可以将SWF加载到ApplicationDomain中。但这个appdomain究竟包含什么呢?模块?类? MXML组件如何代表?如何找到实现我的插件界面的所有类?
2)如果您已经从主应用程序将插件加载到单独的ApplicationDomain中,从其他应用程序域内调用代码是否更为复杂?对于可以通过应用程序间组织编组层的数据种类有什么重要的限制吗?编组过于昂贵?
3)理想情况下,我想开发大部分我自己的主要代码作为一个插件(主要应用程序只不过是一个插件加载的shell),并使用插件架构将该功能提升到应用程序中。这是否在你的心中恐惧?
解决方法
我已经使用ModuleManager
类(和mx.modules
软件包中的其他内容)为Flex应用程序实现了一个简单的插件API。它的主要原因是您从ModuleBase子类化插件,并在主机应用程序中使用ModuleManager加载它们。然后你有插件实现一个通用接口(例如IMyAppPlugin),并使用某种facade表示和实现插件可以使用的主机应用程序的接口(例如MyAppFacade实现IMyAppFacade)。每当加载插件时,注入这个外观参考他们。
Flex 3帮助中的主题“Modular applications overview”有一些很好的信息(“模块域”子部分在模块的上下文中讨论应用程序域)。这是一个摘录:
“By default,a module is loaded into a child domain of the current
application domain. You can specify a
different application domain by using
the applicationDomain property of the
ModuleLoader class.”
主题“Using the ApplicationDomain class”对应用程序域的主题进行了更深入的了解,如果还没有,您应该明白它。