如您所知,我们可以构建基于flex的RIA应用程序。此外,我们可以构建基于AIR的桌面应用程序。我有一个问题,如果我们想建立web&桌面应用程序同时我们可以使用相同的代码将我们的产品运送到网络和桌面?
答案 0 :(得分:5)
如果您为它设计应用程序,那么在Flex和AIR版本之间共享99%的代码库应该没有问题。
您需要为Flex / AIR版本提供单独的应用程序MXML,因为AIR使用WindowedApplication
而Flex使用Application
您需要抽象使用任何AIR-only API。也就是说,http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/images/AirIcon12x12.gif中标有AIR-only图标(the Online Documentation)的任何类,属性或方法。如果使用Swift Suspenders之类的依赖注入容器,则可能会更容易找到此过程。
或者,您可以将服务定义拆分为两个不同的源树。这将导致AIR项目和Flex项目共享一个源路径,但也有自己的源路径。这样,访问com.application.MyService
的代码将在AIR和Flex之间共享,但com.application.MyService
的实现将根据正在使用的“服务源路径”而有所不同。
您可能会发现使用-define+=CONFIG::AIR
等编译器标志配置每个构建很有用。这允许您使用条件编译,以便您可以为两个构建编译相同的文件,但包含AIR构建的特定代码。
以下是条件编译的例子:
public function getMyService() : IMyService
{
CONIFG::AIR
{
return new MyServiceThatUsesAnAIROnlyAPI();
}
return new FallbackServiceForFlex();
}
不幸的是,没有办法'否定'一个条件标志(即!CONFIG::AIR
),所以你需要聪明地使用它,或者包含两个标志(CONFIG::AIR
和{{ 1}})
答案 1 :(得分:1)
我很惊讶没有人说过,但我就是这样做的:
Flex和AIR项目都可以引用和使用库项目中的代码。 AIR项目可以使用AIR特定功能,而不会影响Web项目。
如果需要根据是使用Web项目还是AIR项目以不同方式执行不同的操作,则可以在库项目中创建接口并在主项目中实现它们以使用相应的API。
答案 2 :(得分:0)
请记住,如果应用程序也是一个flex应用程序,那么它将是一个单一的窗口应用程序。 对于我需要的每个项目,我创建了3个项目
代码库(主要控件是组或画布)
flex exporter =>当你构建它时,你将得到一个flex应用程序 它在主应用程序中具有来自#1的控件
air exporter =>当你构建这个时,你将得到一个Air应用程序 它在主窗口内有一个来自#1的控件。