2011-06-10 36 views
3

我有一個用Flex編寫的Web應用程序,我試圖從使用條件編譯的相同代碼庫構建AIR應用程序。Flex(Actionscript)和導入語句中的條件編譯

在AIR應用程序中,我需要有import語句,如下列: 進口flash.data.SQLConnection使用; import flash.filesystem.File; 但我不能在Web應用程序中擁有這些導入語句,因爲它們是僅限AIR的類。

我以爲我可以使用條件編譯來解決這個問題,但是我在頁http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7abd.html上閱讀以下內容:「您不能使用常量布爾值來條件化元數據或導入語句。」

如果是這樣的話,我怎麼能有基於Flex的網絡以及桌面應用中常見的代碼庫?有沒有人解決了這個難題?

感謝,

迪利普

更多關於這個問題的一些試驗和錯誤之後...... 我已經在Eclipse 3個項目爲這個項目......一個用於Web應用程序,一個用於AIR應用程序和一個用於通用的源代碼。在Web和AIR項目中,我指向了通用源代碼。在通用代碼中,我使用了條件編譯,看起來您可以執行以下操作: CONFIG :: desktopMode {0} {0} {0} import flash.data.SQLConnection; import flash.events.SQLEvent; import flash.events.SQLErrorEvent; import flash.filesystem.File; }

和類似的方法來包括在編譯期間幅或AIR特定的功能。該方法似乎迄今爲止工作!

我遇到的唯一問題是我的Cairngorm模型定位器。如果我在Cairngorm的模型定位器中將CONFIG :: desktopMode放在導入語句中,它會開始給出「編譯器中未捕獲的異常」或「1131類不能嵌套」的錯誤。我不知道如何解決這個錯誤!

迪利普

回答

2

可避免進口指在代碼中完全限定類名。這樣你可以使用條件編譯。

+0

好的訣竅,但是讓很可怕的代碼:P – 2011-06-10 18:44:24

+0

@J_A_X,同意。而對於我來說,我更喜歡將平臺相關代碼提取到具有通用接口的獨立類中。通過使用某些依賴注入容器或其他方式(如您在答案中所述)使用接口注入特定實現來使用這些類。 – Constantiner 2011-06-10 18:50:28

1

一個常見的'codebase'並不是真正的情況。您的通用代碼庫是視圖等,但是從您的Flex到您的Air應用程序,您的業務層會發生變化。爲此,我建議您創建2個不同的項目(一個用於Web,另一個用於空氣),併爲所有常見組件,類,任何可以在兩者之間共享的庫項目建立一個項目。

這是不可能的,就像你說'如果flex,只使用這個代碼;如果空氣使用這一個'因爲空氣SDK增加了額外的功能,只是說'導入這個'將無法正常工作,因爲你還需要刪除所有引用導致它不可讀的引用。

您需要構建您的項目正確,這樣就可以分離和抽象出來的大多數類,使他們可以用於兩個項目,然後在每個項目中都有其特定的實現。使用像Parsley這樣的應用程序框架可能會幫助您實現這一點;我知道這對我有幫助。

0

您可以隨時切換到M4等一些完整的預處理器,並使用普通構建工具而不是IDE構建程序。